0

プログラムで決定された 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  

助言がありますか?

4

0 に答える 0