linq
where column 、 operator 、およびすべてに一致する値を含む完全に動的な where 句を実行時に使用したいと考えています。可能であれば、どのように使用できるかを提案してください。私は次のようなことをしたい:
ObjDataTable.AsEnumerable().Where(whereClause);
ここに2つの可能なオプションがあります(もっとあるかもしれません):
動的Linqを使用すると、実行時にLINQクエリを動的に生成できます。
DynamicQueryライブラリは、任意のLINQデータプロバイダー(LINQ to SQL、LINQ to Objects、LINQ to XML、LINQ to Entities、LINQ to SharePoint、LINQ to TerraServerなど)に対して使用できます。言語演算子またはタイプセーフなラムダ拡張メソッドを使用してLINQクエリを作成する代わりに、動的クエリライブラリは、任意の文字列式を渡すことができる文字列ベースの拡張メソッドを提供します。
using System.Linq.Dynamic; //Make sure you reference Dynamic.dll
string whereClause = "CategoryID=2 AND UnitPrice>2";
ObjDataTable.AsEnumerable().AsQueryable().Where(whereClause);
注:ダイナミックLINQライブラリをダウンロードすると、参照する必要のある.dllが次のパスに埋め込まれます。 .\LinqSamples\DynamicQuery\DynamicQuery\bin\Debug
PredicateBuilderは、LinqKitライブラリのクラスです。タイプセーフであり、式を動的に作成できます。おそらくDynamicLinqよりも高い学習曲線ですが、チェックする価値があります。
式ツリーを手動で構築するように駆り立てるすべてのものの中で、動的述語の必要性は、典型的なビジネスアプリケーションで最も一般的です。幸い、このタスクを根本的に単純化する、単純で再利用可能な拡張メソッドのセットを作成することができます。これがPredicateBuilderクラスの役割です。
文字列として渡すことができるように、動的LINQを利用しますwhereClause
メソッド構文を使用して、実行時にフィルタリングを追加できます。
var query = ObjDataTable.AsEnumerable();
if (condition)
query = query.Where(whereClause);
この場合、(文字列の代わりに)whereClauseを強く入力する必要があります。
これについては、Dynamic Expression API(NuGetで入手可能)を確認しましたか。それはかなり簡単で使いやすいようですか?
それがうまくいかない場合はExpression
、実行時にを作成する必要があります。これは私の経験では苦痛になる可能性があります。