2017-02-24 176 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