编写自己的函数以在 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);
}
我有对象
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);
}