2016-09-17 22 views
1

検索多くの場合、適切なソリューションは見つかりませんでした。 lambda expressionに変数を導入しました。そのため、このエラーメッセージが表示されます。さらに、私は "SQL Like Linq Query"を書く問題を解決することができますが、これは私の期待ではありません。私は "Linq Using Lambda Expression"で変数を導入することを期待しています。それは可能かどうか?ステートメント本文のラムダ式を式ツリー(LambdaおよびLinq)に変換できません

文の本文を持つラムダ式は、式ツリーに変換できません。ここで

は私のコードです:

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

["本文のあるラムダ式は式ツリーに変換できません"](http://stackoverflow.com/questions)可能性がありますか?/5179341/a-lambda-expression-a-statement-body-can-be-expression-to-an-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

ありがとう!! ..私はこの解決策を知っています...これは私の期待ではありません。私はLynq式を使用して "LinqのSQL式Linqクエリ"でない変数を導入したいと考えています – TanvirArjel

+0

@IvanStoevエラーは*ラムダ式ステートメント本体を式ツリー*に変換することはできません。なぜこのコンパイルエラーは今までに作られたと思いますか? – user3185569

2

エラーメッセージは非常に明確である:あなたが文の本体を持つラムダ式があり、それは単純に(少なくとも自動コンパイラによる)式ツリーに変換することはできません。そのため、linqプロバイダは、データベースに送信するクエリを作成することはできません(手動で式ツリーを作成した場合でも、LinqプロバイダはそれをSQLクエリに変換することはできません)。

2つのオプションがあります。オプション1は、他のものと同じように、文の本文を含まないようにクエリを書き換えることです。

もう1つのオプションは、オブジェクトに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プロバイダによって遅延ロードが発生する可能性があります。そして熱心な読み込みを使用するように設定した場合は、あまりにも多くのデータを読み込んでいる可能性があるので、あまりうまくいかないかもしれません。

だから、おそらくあなたのクエリを書き直すほうがよいでしょう。

+0

あなたの説明に感謝します! – TanvirArjel

関連する問題