2011-04-07 58 views
3

我想通過一個lambda表達式來實現我的EF查詢中的「IN」條款如下:的LINQ表達式節點類型「調用」不支持LINQ到實體

 /*lambda expression to evaluate: status in[a, b, c...n]*/ 
     _IN myIN = (allStatus, status) => 
     { 
      bool lambdaResult = false; 
      foreach (int s in statuses) 
      { 
       if (status == s) 
       { 
        lambdaResult = true; 
        break; 
       } 
      } 
      return lambdaResult; 
     }; 

     result = (from v in _entity.CAVouchers 
        join vs in _entity.CAVoucherStatus.Where(vs => (myIN(statuses, vs.VoucherStatusId) == true)) on v.VoucherStatusId equals vs.VoucherStatusId 
        join vsr in _entity.CAVoucherStatusReason on v.VoucherStatusReasonId equals vsr.VoucherStatusReasonid 
        where v.CyberAgent.CAID == caid      
        select new ACPVoucher() 
        { 
         ... 
        }).ToList(); 

這是扔由於「where」條件導致「LINQ表達式節點類型'Invoke'在LINQ to Entities中不受支持」錯誤。 基本上我需要的是「哪裏statusId在[1,2,3]」類的子句中。

什麼是失敗?...有關如何做到這一點的任何提示?應用於通用列表時,同樣的方法適用於我。

感謝

回答

3

你可以只是做一個包含查詢:

where statuses.Contains(vs.VoucherStatusId) 
0

不同LINQ提供程序支持不同的技巧;因爲它發生LINQ到SQL與調用。 EF:不是很多。如果您正在手動構建表達式,則可能需要在不調用的情況下形成表達式,或者使用重寫器將其展平。這裏有一個重寫器的例子,說明如何做到這一點:Combining two lambda expressions in c#

1

你可以試試嗎?

join vs in _entity.CAVoucherStatus.Where(vs => statuses.Contains(vs.VoucherStatusId)) on v.VoucherStatusId equals vs.VoucherStatusId 
相關問題