プログラムで決定された Type と PropertyInfo の配列を使用して、Linq を使用して Entity Framework をクエリしたいと思います。基本的に、私たちが行っているのは、データベースの表現である JSON を受け入れることです。現在、文字列から Type を取得できます (必要に応じて、Type から PropertyInfo も取得できます)。
以下は、現在これを達成するために使用している抽出されたコードの一部です。
using (MyEntities db = new MyEntities()) {
Type type = "My.Model.Namespace." + tableNameAsString;
DbSqlQuery records = db.Set(type).SqlQuery(
"SELECT * FROM " + tableNameAsString + " WHERE {0}={1}",
columnToCompare, // string
columnValueToFind // string
);
foreach (object rec in records)
DoSomething(rec);
} // end using
ただし、この状況での生の SQL は、私には適切ではありません。Queryable で使用する Expressions を作成する試みをいくつか試みました。次のソリューションに類似した場所: How to choose the column to be queried by Linq using PropertyInfo? 現在、私のプログラムのフィールドを使用しています
var myRecords = Queryable.Where(db.Set(type), someBuiltExpressionHere);
これは次のコンパイラ エラーを通過できないため、構築された Where 式をテストすることはできませんでした。
"The type arguments for method 'System.Linq.Queryable.Where<TSource>
(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,bool>>)'
cannot be inferred from the usage. Try specifying the type arguments explicitly."
私の知る限りでは (そして私が間違っていることを願っています)、実行時までその型がわからないため、このメソッドにそれを提供することはできません。
私の質問は次のとおりです:直接の SQL を使用せずに、Entity Framework の「テーブル」型と実行時に決定される列名に基づいて Where 句を動的に決定する方法はありますか?
編集:これは、必要なものに本当に近づく式を使用した別のコードですが、まだ最後のステップが1つまたは2つありません。
var param = Expression.Parameter(type, "s");
var left = Expression.PropertyOrField(param, pi.Name);
var right = Expression.Constant(true, pi.PropertyType);
var body = Expression.Equal(left, right);
var where = Expression.Lambda<Func<object, bool>>(body, param);
この時点で、次のコードが機能します。
var records = db.TABLEs.AsQueryable().Where(where).ToList();
次のコードはそうではありません:
var records = db.Set(type).AsQueryable().Where(where).ToList();
2 番目のステートメントから 2 つのコンパイラ エラーが発生します。
1. Instance argument: cannot convert from 'System.Linq.IQueryable' to 'System.Linq.IQueryable<My.Model.Namespace.TABLE>'
2. 'System.Linq.IQueryable' does not contain a definition for 'Where' and the best extension method overload 'System.Linq.Queryable.Where<TSource>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,bool>>)' has some invalid arguments
助言がありますか?