0

我正在使用 OData 和 .NET DataServiceQuery 类。我有一个实例,我想根据 ID(1、2、3 中的 ID)查询多个实体的 OData 服务。但是,OData 需要将其作为 ID = 1 或 ID = 2 或 ID = 3 格式,这很好。但在客户端,我不知道提前需要多少个 ID,所以我需要能够翻译以下内容:

列表 ids = .... query.Where(x => ids.Contains(x.ID)

我已经熟悉创建自己的 IQueryable 并且正在这样做并翻译 LINQ 表达式的其他部分。我只是不确定如何将 Contains lambda 转换为 OR lambda,评估传入列表以生成条件。

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 回答