3

特定のアカウント ID を持つエンティティ モデル (私は EF バージョン 5 を使用しています) からレコードのリストを取得したいと考えています。tableName 文字列 (これは動的でなければなりません) と accountID が提供されています。次の2つの方法を試していますが、どれも機能していません(IQueryableオブジェクトの「テーブル」でエラーが発生します:


PropertyInfo info = _db.GetType().GetProperty(tableName);
IQueryable table = info.GetValue(_db, null) as IQueryable;

var query = table.Where(t => t.AccountID == accID)
                        .Select(t => t);

List <object> recList = (   from records in table
                            where records.AccountID == accID
                            select records).ToList<object>();

4

2 に答える 2

8

実行時にクエリビルダーのリフレクションを許可するため、これvar query = table.Where(....).Select(...)は正しい動きです。ただし、型が不明t.AccountIDのままなのでエラーです。t

System.Linq.Expressions.Expressionを使用して、以前にLINQ to SQLで同様のアプローチを使用しました 。

    // NOT TESTED
    var table=context.GetTable(dynamicTableName);
    var theT=table.Experssion; // actually, I forget. DynamicExpression  or MemberBinding? or
    var theField=Expression.Field(theT, "AccountID"); // or dynamic name
    var query=table.Where(Expression.Equal(theField, accID);
    var recList=query.ToList<object>();

オブジェクトに共通のインターフェースがある場合、より単純な構文があります。

IQueryable<MyInterface> table = context.GetTable("table") as IQueryable<MyInterface>;
    var recList=from r in table
                where table.AccountID == ac // if your AccountID is on MyInterface
                select table;

サポートするテーブルが数個しかない場合は、次のようにすることもできます。

    IQueryable<MyInterface> table;
    if("table1"==tableName)
       table=_db.table1
    elseif("table2"==tableName)
       table=_db.table2
    elseif("table3"==tableName)
       table=_db.table3
    else
       throw exception
于 2014-09-16T01:23:02.560 に答える
0

私が取り組んでいるプロジェクトの DynamicRepository を構築しました。動的 linq と共に EF を通じて公開されるジェネリック メソッドを使用します。ここでそのソース コードを確認すると役立つ場合があります。

https://dynamicmvc.codeplex.com/SourceControl/latest#DynamicMVC/DynamicMVC/Data/DynamicRepository.cs

エンティティ フレームワーク メタデータ ワークスペースにクエリを実行して、特定のテーブル名の型を取得できます。このリンクが役立つ場合があります: テーブルとリレーションシップの取得

于 2014-09-16T03:11:25.740 に答える