编写自己的函数以在 c# linq 语句中使用

Write own functions to be used in c# linq statement

我有对象

public class Product{
       public int Id { get; set; }
       public double Cost { get; set; }
       public DateTime DatePurchased { get; set; }
       public string Name { get; set; }
       public string Barcode { get; set; }
       public string Category { get; set; }
}

我还有一个函数 public void TotalProductDiscountHistory(DateTime datePurchased, double cost) 可以执行一些复杂的数学运算和 return 从购买之日到现在的折扣值。 我想基本上能够在我的查询语句中调用此函数来 return 所有产品的所有可能的总和,如下所示。

var query = db.Products.where(x => x.clientId == clientId)
.GroupBy(c => c.Category).Select(a => new {
Category = a.Category,
Cost = a.Sum(u => u.Cost),
TotalDiscounts = a.Sum( TotalProductDiscountHistory(a.DatePurchased, 
a.Cost))
});

我的问题是如何实现这个,或者更确切地说,我如何创建一个函数,以便我能够在 linq 查询语句中调用它,传递值并 return 结果。

您的主要问题是 EF 正在尝试将 LINQ 查询转换为 SQL。由于没有 SQL 等同于您的函数,它实际上必须提取该计算所需的数据,并在 SQL 查询之后在代码中执行。

Linq2SQL 非常出色,可以自动处理。 EF(即使在 6 个版本之后),也没有那么多。

所以,我们必须手动完成:

public double TotalProductDiscountHistory(DateTime datePurchased, double cost) {...}

class CategoryTotals
{
     public int Category {get; set;}
     public double Cost {get; set;}
     public double TotalDiscounts {get; set;}
}

var query = from p in db.Products
            where P.clientId == clientId
            group p by p.Category;


 var totals = new List<CategoryTotals>();
foreach(var grp in query)
{
     var ct = new CategoryTotals
            {
                Category =grp.Category,
                Cost = grp.Sum(u => u.Cost),
                TotalDiscounts = grp.Sum(u=> 
                        TotalProductDiscountHistory(u.DatePurchased, u.Cost))
            };
     totals.add(ct);
}