2016-12-04 6 views
1

私はDynamic Linqを使ってクエリを構築しようとしています。例:Dynamic Linq "Where statement" with Relation

List<Publication> results = new List<Publication>(); 

// Just an example, previously calculated dynamically 
string filterQuery = "(Id = 1 and Number = 2)"; 

IQueryable<Publication> query = db.Publications.Include(i => i.Product); 
query = query.Where(filterQuery); 

results = query.OrderBy(orderQuery).ToList(); 

これは偉大な作業であり、製品のリストを取得しています。今、...質問があります。 Dynamic Linqと文字列ステートメントを使用してProductとの関係に基づいて結果を得るために文字列ステートメントを作成するにはどうすればよいですか?

何かのように:

string filterQuery = "(Id = 1 and Number = 2 and Products.Id = 1)" 

答えて

1

研究や物事をしようと多くの後、これは同じダイナミックLINQのライブラリを使用して簡単かつ友好的な方法である:

List<Publication> results = new List<Publication>(); 

// Just an example, previously calculated dynamically 
string filterQuery = "(Id = 1 and Number = 2)"; 
string filterQueryChildren = "Products.Any(Id == 1)" 

IQueryable<Publication> query = db.Publications.Include(i => i.Product).Where(filterQueryChildren); 

query = query.Where(filterQuery); 

results = query.OrderBy(orderQuery).ToList(); 
1

私はあなたがこれをやっている理由はわからないけど、次は動作するはずです:

List<Publication> results = new List<Publication>(); 

// Just an example, previously calculated dynamically 
string filterQuery1 = "(Id = 1)" 
string filterQuery2 = "(Id = 1 and Number = 2)"; 

IQueryable<Publication> query = db.Publications. 
Where(filterQuery1).  
Include(i => i.Product); 
query = query.Where(filterQuery2); 

results = query.OrderBy(orderQuery).ToList(); 
+0

申し訳ありませんが、これは動作しません。私は "Include path式は型に定義されたナビゲーションプロパティを参照する必要があります。参照ナビゲーションプロパティには点線のパスを使用し、コレクションナビゲーションプロパティにはSelect演算子を使用してください。 –

+1

私はコードを修正しました。それはうまく動作するはずです。 – agfc

+0

いいえ!それは動作していません。 IdとNumberがPublicationsの属性であり、CategoryIdがProductsの属性であるとします。 Id = 1とNumber = 2のPubicationsを見つけて、CategoryId(製品の)が3の製品を含むようにしたいとします。あなたの例は私に与えられます: '出版物'タイプの 'CategoryId'プロパティもフィールドもありません –

0

は、動的LINQクエリを作成するには、サポートライブラリが必要それかExpression Tree

参照してそれを自分でやって:Entity Framework Dynamic Query Library

免責事項:私はこのライブラリプロジェクトEval-Expression.NET

の持ち主だあなたは、評価し、コンパイル、実行時にコードを実行することができます。

は、ライブラリは、動的LINQの拡張メソッドが含まれてい

ウィキ:Eval Dynamic LINQ

// using Z.Expressions; // Don't forget to include this. 

// The filterQuery must use the C# syntax 
string filterQuery = "x.Id == 1 && x.Number = 2"; 

IQueryable<Publication> query = db.Publications.Include(i => i.Product); 
query = query.Where(x => filterQuery); 

EDIT:回答サブ質問

グレートが、どのように私がすることができます製品別にフィルタリングする

エンティティフレームワークは、インクルードメソッドのフィルタをサポートしていません。私はEntity Framework Plus

参照の所有者だ:

// Extension method must be registered, otherwise the library cannot be aware of which extension method exists! 
EvalManager.DefaultContext.RegisterExtensionMethod(typeof (QueryIncludeFilterExtensions)); 

string where1 = "x.Id == 1 && x.Number == 2"; 
string where2 = "y.Id == 3"; 

var left2 = ctx.Publications 
    .Where(x => where1) 
    .Execute<IQueryable<Publication>>("IncludeFilter(x => x.Product.Where(y => " + where2 + "))") 
    .ToList(); 
:両方のライブラリを組み合わせることで EF+ Query IncludeFilter

、あなたが希望する結果を達成することができます

しかし、EFは+

免責行います

このソリューションをお試しになる場合は、ダウンロードしてくださいe最新版のEval-Expression.NET。私たちはあなたのシナリオを試して見つけた問題を数分前に修正しました。

EDIT2:回答サブ質問

ここでは、私はあなたをお勧めするものです。

私たちのライブラリなしでクエリを試してから、それを動的に試してみてください。

コンパイルエラーや本当にやりたいことを簡単に見つけることができます。

たとえば、初期の問題を正しく理解していない可能性があり、不要なIncludeFilterを提案した可能性があります。私はあなたが複数の製品をフィルタリングしたいと思っていました。ただし、パブリケーションごとに1つのプロダクトしかないように見えるため、Where句のメソッドは明らかに存在しません。

多分これはあなたが探しているより多くのものです:

string where1 = "x.Id == 1 && x.Number == 2 && x.Product.Id == 3"; 

var left2 = ctx.Publications 
    .Include(x => x.Product) 
    .Where(where1) 
    .ToList(); 

だから、要するに、あなたは後に動的にそれを使用する方法を知っています(ダイナミックなし)、それをハードコーディングしてクエリを試してみてください。

+0

素晴らしいですが、どのように製品別にフィルタリングできますか?例:x.Id == 1 && x.Number == 2は出版のためのものです。 x.Id == 1 && x.Number == 2 && i.Id = 1のようなものを作ることはできますか? (出版物はx、製品はi) –

+0

あなたの答えはJohnathanです。だから...私はEval-Expression.NETとEntity Framework Plus用のNuGetパッケージを入手し、コントローラのメソッドでライブラリを登録しています。 –

+0

はい、正確です。注意してください、EF +は常に無料ですが、Eval-Expression.NETは50文字に達するまで無料です(あなたはうまくいくはずです)。あなたが正常に動作するかどうか私に教えてください。 –