6

誰かが 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 拡張子を作成する必要があるのでしょうか?

4

1 に答える 1

2

GetExpressionは、式タイプ(DynamicQueryable.Whereメソッドを拡張メソッドとして使用する場合、最初のパラメーターとして文字列を予期します)を返します。

あなたはこのように見える場所へのあなたの呼び出しが必要です:

var query = db.SysEventLogT.Where("Age > @0", 15); 

また、明確にするために、次のことを試すこともできます。

var query = db.SysEventLogT.AsQueryable().Where("Age > @0", 15); 

簡単な場合は、完全なフィルターを含むstingを作成し、paramsobject[]パラメーターをまったく使用しないようにすることができます。

var query = db.SysEventLogT.AsQueryable().Where("Age > 15"); 
于 2010-12-31T13:12:17.190 に答える