2017-02-24 96 views
0

我有以下代码(这仅仅是相关部分):选择内部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我severl其他查询重复也。我的问题是,如果有一种方法以某种方式包裹那表情像功能:

Expression<Func<crmInvoice_Invoice, double>> unpaidExpression = // that unpaid amount caluculation expression 

然后调用这样的:

linqQuery.Select(invoice => 
    new InvoiceDetailed 
    { 
      UnpaidAmount = unpaidExpression(invoice) 
    } 

然后,我可以在多个查询重用。是否有可能在LINQ中做类似的事情?如果不是,有没有其他解决方案可以建议我避免重复这部分代码?

回答

2

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

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

正确的,但应注意的是,这适用于OP在标签中提到的实体框架。它可以按照在IEnumerable '上运行的LINQ中的预期工作。 – decPL