0

以下のコードが「...にいくつかの無効な引数がある」をスローする理由

    var qry = listFoo.Where(lambda);

述語デリゲートを渡してWhereを呼び出すには、listFooをどのように記述すればよいですか。私のコード全体は以下のとおりです。

    List<Foo> listFoo = new List<Foo>();

    ParameterExpression foo = Expression.Parameter(typeof(Foo), "foo");
    MemberExpression bar = Expression.PropertyOrField(foo, "Bar");
    ConstantExpression abc = Expression.Constant("abc", typeof(string)); 
    BinaryExpression test = Expression.Equal(bar, abc);

    Expression<Func<Foo, bool>> lambda = Expression.Lambda<Func<Foo, bool>>(test, foo);

    var qry = listFoo.Where(lambda);
4

2 に答える 2

3

あなたのリストはIQueryableではないからです。どうしてこんなことをしてみませんか?

var qry = listFoo.Where(foo => foo.Bar == "abc");

それができない場合は、次のようにします。

var qry = listFoo.Where(lambda.Compile()); //warning, slow performance
于 2012-05-30T13:36:26.957 に答える
0

IEnumerableのLINQ拡張メソッドは、デリゲートインスタンス(Action<>またはFunc<>オブジェクト)を取ります。ラムダは単なるデリゲートリテラルであるため、この場合Expression<Func<>>、デリゲートではなくPLANを指定しているため、これは必要ありません。式はこれですべてです。これは、一部のデータを処理する方法の計画です。IQueryableは式を受け取り(コンパイラはデリゲートリテラルをsとして扱いますExpression)、計画を取り、統合できるようにします(削減できる場合)。

IEnumerableの場合、メソッドに渡す前にCompile()を呼び出す必要があります。ただし、これは可能です。Expression<Func<>>Where

var qry = listFoo.AsQueryable().Where(lambda);

ただし、これにより結果が得られるため、、、などをIQueryable<Foo>実行する必要があります。AsEnumerableToListToArray

于 2012-05-30T13:41:00.090 に答える