0

ODataおよび.NETDataServiceQueryクラスを使用しています。ID(1、2、3のID)に基づいて複数のエンティティについてODataサービスにクエリを実行するインスタンスがあります。ただし、ODataはこれをID=1またはID=2またはID=3形式として必要とします。これは問題ありません。しかし、クライアント側では、事前に必要なIDの数がわからないため、次のように翻訳できる必要があります。

リストID=.... query.Where(x => ids.Contains(x.ID)

私はすでに独自のIQueryableの作成に精通しており、それを実行してLINQ式の他の部分を変換しています。包含ラムダをORラムダに変換し、着信リストを評価して条件を生成する方法がわかりません。

4

2 に答える 2

3

この方法で新しい式を作成する必要があります。このようなもの:

public Expression GetOrExpression( MethodCallExpression containsExpression )
{
    var list = (IEnumerable)((ConstantExpression)containsExpression.Object).Value;
    var p = containsExpression.Arguments[0];

    Expression expression;

    foreach(var item in list)
    {
        var equal = Expression.Equal(p, item);
        if(expression == null)
            expression = equal;
        else
            expression = Expression.OrElse(expression, equal);
    }
    return expression;
}

それが役に立てば幸い。

于 2013-01-03T17:07:02.840 に答える
2

Dynamic Linqを活用して、実行時に生成された文字列を使用してクエリを実行できます。基本的に、その拡張メソッドスイートを使用すると、実行時にコンパイルされる文字列としてlinq静的ステートメントをコーディングできます。

于 2013-01-03T17:04:29.053 に答える