Where
機能するクエリを作成するために、LINQ-to-Object と LINQ-to-Entities の両方で使用できる拡張メソッドを作成しようとしています。最終的にはさらに詳しくなりますが、最初に、ラムダ列の選択を取り、それをContains()
呼び出しのベースとして使用するメソッドを取得するだけで問題が発生しています。LINQ-to-Objects で何かを機能させることができましたが、LINQ-to-Entities で使用しようとすると問題が発生します。
LINQ-to-Objects で機能するのは次のとおりです。
public static IQueryable<T> WhereContains<T>(this IQueryable<T> query, Expression<Func<T, string>> column, IList<string> values)
{
return query.Where(o => values.Contains(column.Compile().Invoke(o)));
}
これが Entity Framework に対して実行されると、例外が発生します
LINQ to Entities はメソッドを認識しません...
これには を使用する必要があると感じてExpressionVisitor
いますが、どのように配線する必要があるのか わかりません。
アップデート:
xanatos によって提供された回答は、ExpressionVisitor を使用せずにこれを達成する簡単な方法を示しているため、これは重複していないと主張します。