选择内部linq选择

时间:2017-02-24 15:38:24

标签: c# entity-framework linq

我有以下代码(这只是相关部分):

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中可以做类似的事情吗?如果不是有任何替代解决方案,你可以建议我避免重复那部分代码吗?

1 个答案:

答案 0 :(得分:2)

不,这是不可能的。 Select方法将Expression作为参数。 LINQ to SQL将Expression解析为SQl代码。因此,要解决您的任务,您需要将表达式转换为返回InvoiceDetailed

Expression<Func<crmInvoice_Invoice, InvoiceDetailed>> InvoiceDetailedExpression = ...