私は最初のEntity Frameworkのコードでは、次のことを行うしたいと思います:インナー方法
Data.GroupBy(x => x.Person.LastName)
.Select(x => x.OtherGrouping(...)).Where(...).GroupBy(...)...etc
public static class Extensions
{
public static IQueryable<IGrouping<T, T>> OtherGrouping<T>(this IQueryable<T> collection /**** Here I want to pass consts and lambdas\expressions*****/)
{
// Grouping, filtration and other stuff here
return collection.GroupBy(x => x);
}
}
問題は、.NETはOtherGrouping
方法は、それが表現のように表していないコンパイルされ、 SQLに変換できませんでした。
私はLinqKitというような場合に役立つライブラリを見つけましたが、私は特定のケースでどのようにそれを適用するかを理解できませんでした。私はちょうどx => x+2
のような式を持っている単純なケースでうまく動作しますが、IQueryableの戻り値に悩まされます。おそらく、手で完全に表現木を書くことは可能ですが、私は深く行きたくありません。
どうすればいいのか、どこで読むことができるのでしょうか?ここで
は、私はロブのコメント
void Main()
{
AddressBases.GroupBy(x => x.ParentId).Select(x => new {x.Key, Items = x.AsQueryable().OtherGrouping(a => a.Country) }).Dump();
}
public static class Extensions
{
public static IQueryable<IGrouping<TKey, TSource>> OtherGrouping<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector)
{
return source.Provider.CreateQuery<IGrouping<TKey, TSource>>(
source.GroupBy(keySelector).Expression);
}
}
に基づいて実行しようとしましたそして、私は例外を得たものである:
NotSupportedException: LINQ to Entities does not recognize the method 'System.Linq.IQueryable`1[System.Linq.IGrouping`2[System.String,InsuranceData.EF.AddressBase]] OtherGrouping[AddressBase,String](System.Linq.IQueryable`1[InsuranceData.EF.AddressBase], System.Linq.Expressions.Expression`1[System.Func`2[InsuranceData.EF.AddressBase,System.String]])' method, and this method cannot be translated into a store expression.
私はOtherGroupingメソッドを持っている理由はまだ把握できませんでした表現木? OtherGroupingメソッドは、式に別のグループ化を追加し、それをプロバイダに渡しますが、ツリー自体には入れません。
と交換する式の訪問者を記述する必要があります。例をご覧ください(https://github.com/Microsoft/referencesource/blob/master/System.Core/System/Linq/IQueryable.cs#L90)。 – Rob
ありがとう@ロブ、LINQのソースコードを見てみることをお勧めします。私の愚かさの原因私はEFのソースと障害でそれを見つけようとしました。私はすぐにそれを試してみましょう、あなたはコメントの代わりに回答を投稿することができますので、私はそれを受け入れることができ、それは他の人に見えるようになります – Neir0