我正在使用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,评估传入列表以生成条件。
答案 0 :(得分: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;
}
希望它有所帮助。
答案 1 :(得分:2)
您可以利用Dynamic Linq并使用运行时生成的字符串进行查询。 基本上,扩展方法套件允许您将linq静态语句编码为在执行时编译的字符串。