2014-02-05 37 views
0

我有下面的代碼:如何解決問題「無法將表達式...轉換爲SQL,無法將其視爲本地表達式」。

void Main() 
{ 
    var q = from a in Applicants 
      where(a.Claims.Any()) 
      select a.Claims.Sum(c => c.TotalClaimAmount()); 


    q.Dump(); 
} 

public static class MyExt 
{ 
    public static decimal TotalClaimAmount(this Claim c) 
    { 
     var t = c.Accommodations.Sum(a => a.AmountClaimed) + 
       c.MealAllowances.Sum(ma => ma.AmountClaimed) + 
       c.Meals.Sum(m => m.AmountClaimed) + 
       c.Mileages.Sum(mi => mi.AmountClaimed) + 
       c.Others.Sum(o => o.AmountClaimed) + 
       c.ParkingTransits.Sum(pt => pt.AmountClaimed) + 
       c.Travels.Sum(tr => tr.AmountClaimed); 

     return (decimal)t; 
    } 
} 

當我運行它在LinqPad得到以下問題:

出現InvalidOperationException:無法翻譯表達「a.Claims.Sum(C => c.TotalClaimAmount()) '轉換爲SQL,不能將其視爲本地表達式。

請幫我一把。非常感謝

回答

3

在您的自定義方法沒有相應的命令在SQL中。所以編譯器無法翻譯你的表達式。相反,先得到你的項目,然後選擇您的結果:

var items = Applicants.Where(a => a.Claims.Any()).ToList(); 
var results = items.Select(a => a.Claims.Sum(c => c.TotalClaimAmount()); 
+2

當然,這會在客戶端上運行一切,導致N + 1問題和可怕的性能。 – usr

+0

maybe.but我沒有看到另一種(更好)的方式:) –

5

LINQ是無法將TotalClaimAmount方法調用轉換爲SQL表達式。

你可以做的是從TotalClaimAmount方法中提取表達式並直接在Sum方法調用中使用它。

public static class MyExt { 
    public static Func<Claim, decimal> TotalClaimAmountFunc = c => 
     c.Accommodations.Sum(a => a.AmountClaimed) + 
     c.MealAllowances.Sum(ma => ma.AmountClaimed) + 
     c.Meals.Sum(m => m.AmountClaimed) + 
     c.Mileages.Sum(mi => mi.AmountClaimed) + 
     c.Others.Sum(o => o.AmountClaimed) + 
     c.ParkingTransits.Sum(pt => pt.AmountClaimed) + 
     c.Travels.Sum(tr => tr.AmountClaimed); 

    public static decimal TotalClaimAmount(this Claim c) { 
     return TotalClaimAmountFunc(c); 
    } 
} 

void Main() { 
    var q = from a in Applicants 
     where(a.Claims.Any()) 
     select a.Claims.Sum(MyExt.TotalClaimAmountFunc); 

    q.Dump(); 
} 
+0

嗨盧卡斯,你的代碼是行不通的。它有編譯錯誤。 「名稱'TotalClaimAmountFunc'在當前上下文中不存在」 –

+0

我只是忘了'MyExt',請參閱編輯答案。 –

+0

我懷疑你需要使用表達式>而不是Func <> –

相關問題