我有两个实体类:
public class Invoice
{
public int ID { get; set;}
public int Amount { get { return InvoiceLines.Sum(il => il.Amount); }}
public EntitySet<InvoiceLines> InvoiceLines {get;set;};
}
public class InvoiceLine
{
public Invoice Invoice {get;set;}
public int InvoiceID {get;set;}
public int Amount {get;set;}
public string SomeHugeString {get;set;}
}
(真正的类是 sqlmetal 生成的,我在这里缩短了它以达到目的)。
查询所有金额:
var amounts = from i in invoice select i.Amount;
这将导致所有发票行延迟加载,每张发票调用一个数据库。我可以使用数据加载选项解决它,但这会导致读取整个 InvoiceLine 对象,包括 SomeHugeString
。
在查询中重复金额计算会得到一个好的SQL翻译:
var amounts = from i in invoice select i.InvoiceLines.Sum(il => il.Amount);
我希望 linq-to-sql 以某种方式从函数/属性中获取表达式树的一部分。有没有办法重写 Invoice.Amount
以便第一个金额查询将提供与第二个相同的 SQL 转换?
最佳答案
您可以使用来自 LINQKit 的 AsExpandable()
做类似的事情:
Expression<Func<Invoice, int>> getAmount =
i => i.InvoiceLines.Sum(il => il.Amount);
var amounts = from i in invoice.AsExpandable() select getAmount.Invoke(i);
关于c# - 将 linq-to-sql 表达式的一部分分解为一个单独的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7945685/