2016-09-17 205 views
1

搜索很多,但沒有找到適合我的解決方案。我在lambda expression中引入了一個變量,這就是顯示此錯誤消息的原因。此外,我可以解決編寫「SQL Like Linq Query」的問題,但這不是我的期望。我的期望是在「Linq使用Lambda表達式」中引入變量。這可能嗎?帶有語句正文的lambda表達式無法轉換爲表達式樹(Lambda和Linq)

帶有語句正文的lambda表達式不能轉換爲表達式樹。

這裏是我的代碼:

IQueryable<IGrouping<int, AnimalFood>> animalFoods = db.AnimalFoods.GroupBy(x => x.FoodId); 
IQueryable<FoodSummaryViewModel> foodSummaryViewModel = animalFoods.Select(g => 
{ 
    var animalFood = g.FirstOrDefault(); 
    return new FoodSummaryViewModel() 
    { 
     FoodName = animalFood.Food.FoodName, 
     FoodPrice = animalFood.Food.UnitPrice, 
     TotalFoodQuantity = g.Sum(x => x.Animal.AnimalQuantity * x.FoodQuantity), 
     TotalPrice = g.Sum(x => x.Animal.AnimalQuantity * x.FoodQuantity) * animalFood.Food.UnitPrice 
    }; 
}); 
return foodSummaryViewModel.ToList(); 
+1

的[「與語句體lambda表達式不能轉換爲表達式樹」]可能的複製(http://stackoverflow.com/questions/5179341/a-lambda-expression-with-a-statement-body-can-be-conversion-to-a-expression) –

回答

0

你不能寫一個LINQ-2-DB查詢中多行的方法,因爲這種多線法不能轉化成表達式樹可以由提供者解釋並轉換爲純SQL語句。你可以這樣做:

var results = (from f in animalFoods 
       group f by f.FoodId into groups 
       let animalFood = groups.First() 
       select new FoodSummaryViewModel() 
       { 
       FoodName = animalFood.Food.FoodName, 
       FoodPrice = animalFood.Food.UnitPrice, 
       TotalFoodQuantity = groups.Sum(x => x.Animal.AnimalQuantity * x.FoodQuantity), 
       TotalPrice = groups.Sum(x => x.Animal.AnimalQuantity * x.FoodQuantity) * animalFood.Food.UnitPrice 
       }).ToList(); 
+0

錯誤OP越來越與db查詢翻譯無關。這是編譯時錯誤。 –

+0

謝謝!!我知道這個解決方案..這不是我的期望..我想在「Linq使用Lamda表達式」而不是在「SQL Like Linq查詢」中引入變量 – TanvirArjel

+0

@IvanStoev錯誤是* lambda表達式與語句正文不能轉換爲表達式樹*。你爲什麼認爲這個編譯錯誤是有史以來創建的? – user3185569

2

的錯誤信息是非常明確的:你有一個說法身體lambda表達式,這根本無法轉換爲表達式樹(至少不會自動編譯器)。因此,您的linq提供程序不能創建一個查詢來發送到數據庫(即使您手動創建了表達式樹,這並不重要,您的linq提供程序將無法將其轉換爲SQL查詢)。

您有兩種選擇。如其他人所示,選項一是重寫你的查詢,使其不包含語句正文。

另一種選擇是在內存中執行部分查詢,使用linq到對象。您必須小心使用這種方法,並避免從數據庫中獲取太多數據。但這樣做將是:

IEnumerable<IGrouping<int, AnimalFood>> animalFoods = 
    db.AnimalFoods.GroupBy(x => x.FoodId).AsEnumerable(); 
IEnumerable<FoodSummaryViewModel> foodSummaryViewModel = animalFoods.Select(g => 
{ 
    var animalFood = g.FirstOrDefault(); 
    return new FoodSummaryViewModel() 
    { 
     FoodName = animalFood.Food.FoodName, 
     FoodPrice = animalFood.Food.UnitPrice, 
     TotalFoodQuantity = g.Sum(x => x.Animal.AnimalQuantity * x.FoodQuantity), 
     TotalPrice = g.Sum(x => x.Animal.AnimalQuantity * x.FoodQuantity) * animalFood.Food.UnitPrice 
    }; 
}); 
return foodSummaryViewModel.ToList(); 

,可能會給你什麼你覺得你想要的,但它可能不是一個好主意,但。您的選擇器正在使用AnimalFood.Animal.AnimalQuatity屬性鏈,這可能導致延遲加載,具體取決於您的Linq提供程序。如果您已將其配置爲使用急切加載,則可能不會更好,因爲您可能正在加載太多數據。

所以你可能會更好的重寫你的查詢。你確定這樣的事情不會做的工作:

var q = from food in db.Foods 
     select new FoodSummaryViewModel 
     { 
      FoodName = food.FoodName, 
      FoodPrice = food.UnitPrice, 
      TotalFoodQuantity = (from fa in food.AnimalFoods 
           select fa.Animal.AnimalQuantity).Sum() * food.FoodQuantity 
      TotalPrice = (from fa in food.AnimalFoods 
          select fa.Animal.AnimalQuantity).Sum() * food.FoodQuantity * food.UnitPrice 
     }; 
return q.ToList(); 
+0

非常感謝您的解釋! – TanvirArjel