誰かが Linq.Dynamic 名前空間に非常に精通している場合、私は助けを借りることができます.インターネット上で詳細なリソースを見つけることができませんでした.
基本的には DynamicExpression.ParseLambda を使用して、コンパイル時に型がわからない式を作成していますが、
public Expression GetExpression(Type t, List<QueryFilter> filters)
{
// pseudo code
// extracts a string representation of the query as 'expressionString'
return DynamicExpression.ParseLambda(t, typeof(Boolean), expressionString, values);
}
QueryFilter の場所:
public class QueryFilter
{
string propertyName;
ExpressionType operationType;
object value;
}
これは、「Age > 15」などの単純なバイナリ関数を表します。
これが「GetExpression」関数の仕組みです。入力型と出力型の 2 つの型を取り、最終的に Func デリゲートで通常作成されるものを生成します。また、クエリを表す文字列と、値の params object[] も受け取ります。これらはそれぞれ、上記の「expressionString」と「values」です。
ただし、SqlMetal (.dbmc ファイル) から生成された DataContext を使用して、LINQ-to-SQL で動的式を実行するのに問題があります。
DatabaseContext db = new DatabaseContext(connectionString);
var filter = DynamicExpressionBuilder.
GetExpression(typeof(SysEventLogT), sysEventFilters)
var query = db.SysEventLogT.Where(filter);
次のエラーが発生します。
System.Data.Linq.Table<DBReporting.Linq.Data.SysEventLogT>
「Where」の定義と最適な拡張メソッドのオーバーロードが含まれていません
System.Linq.Dynamic.DynamicQueryable.Where<T>(System.Linq.IQueryable<T>, string, params object[])
には無効な引数があります。
私の DataContext インスタンスが実際に SQL テーブルをプロパティとして扱うことはわかっています...これが機能するためには、GetProperty() を反映する必要がありますか? または、別の .Where 拡張子を作成する必要があるのでしょうか?