我有以下代码(这只是相关部分):
linqQuery.Select(invoice =>
new InvoiceDetailed
{
UnpaidAmount = e.SumAmount +
e.OverdueNotices.OrderByDescending(on => on.SendDate).Select(on => on.Fee).DefaultIfEmpty(0).Sum() +
e.CreditNotes.Select(c => c.CreditNoteAmount).DefaultIfEmpty(0).Sum() -
e.Payments.Select(p => p.Amount).DefaultIfEmpty(0).Sum()
}
UnpaidAmount的这个计算我也在其他查询中重复。我的问题是,是否有办法以某种方式将该表达式包装在函数中:
Expression<Func<crmInvoice_Invoice, double>> unpaidExpression = // that unpaid amount caluculation expression
然后这样打电话:
linqQuery.Select(invoice =>
new InvoiceDetailed
{
UnpaidAmount = unpaidExpression(invoice)
}
然后我可以在更多查询中重用它。在LINQ中可以做类似的事情吗?如果不是有任何替代解决方案,你可以建议我避免重复那部分代码吗?
答案 0 :(得分:2)
Select
方法将Expression
作为参数。 LINQ to SQL将Expression
解析为SQl代码。因此,要解决您的任务,您需要将表达式转换为返回InvoiceDetailed
:
Expression<Func<crmInvoice_Invoice, InvoiceDetailed>> InvoiceDetailedExpression = ...