3

私はEFコードを最初に使用しています。4.2、 where句を動的に構築する必要があるときに、どのような解決策を提案しますか? はまだ機能が非常に必要とされるであろう含める:ダイナミックwhere節を構築する、Linq to SQL

var results = db.Set<dynamicType>.Where("dynamic conditions").Include("...."); 

上記動的条件がレコードをフィルタリングするために、別のテーブルにルックアップする必要があります。 私はLINQの式でそれを書きたい場合、それはのようになります。

var result = db.Set<Contact>().Where(c=>c.AccountId == _Id_param || db.Set<LinkTable>().Any(a=>a.FkFieldId == c.AccountId && a.ParentId == _Id_param)).Include("Quotes"); 

基本的には、異なるタイプのWhere欄が変更されているため(Contactは唯一の例です)、FKフィールドは「AccountId」となる可能性があります。 「AccountFKId」にする。したがって、Where句は動的でなければなりません!あなたは常に、少なくともあなたはSet<>呼び出しにして開始する予定されているどのような種類を知っている必要がありますので

var query = db.Set<Contact>().Include(...); 

if (something) 
{ 
    query = query.Where(...); 
} 

// Other wheres 

LINQのは強く型付けされています。あなたはその場でクエリを構築することができるように

答えて

1

UPDATE

私は直接、式ツリーを変更すると、問題を解決することができました。 TomasP's blogからのアイデアを使用して

がたくさん助け:

キーは、内部クエリの第二のIQueryableを作成し、既存の動的モデルの表現のIQueryableに表現としてそれを渡すことでした。

IQueryable<LinkTable> linkQuery = db.Set<LinkTable>().AsQueryable(); 

MethodCallExpression internalQueryWhere = Expression.Call(typeof(Queryable), "Where", new Type[] { linkQuery.ElementType }, linkQuery.Expression,Expression.Lambda<Func<LinkTable, bool>>(myfilters, new ParameterExpression[] { filterParameter })); 

linkQuery = linkQuery.Provider.CreateQuery<LinkTable>(internalQueryWhere); 

Expression anyMethodExpr = Expression.Call(typeof(Queryable), "Any", new Type[] { linkQuery.ElementType }, linkQuery.Expression); 

今、あなたは、元のエンティティのIQueryableをwhere句にanyMethodExprを渡すことができます。

3

IQueryableが構成可能です。あなたは一般的だが動的ではない(あなたがリフレクションを通して全体を書くつもりがない限り)ようにすることができる。

dynamic linqを使用して文字列の条件を定義できますが、少なくともSet<>の型を知る必要があります。

+0

ご回答いただきありがとうございますが、どうすればこのクエリを動的linqに書き込むことができますか?私はこれをまとめるにはDynamic linqについて十分に知りません。特にwhere節の別のテーブルから検索する必要のある部分。 – sam360