Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将LINQ包含的内容转换为或_C#_Linq_Lambda - Fatal编程技术网

C# 将LINQ包含的内容转换为或

C# 将LINQ包含的内容转换为或,c#,linq,lambda,C#,Linq,Lambda,我正在使用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表达式的其他部分。我只是不知道如何将包含的lambda转换为或lam

我正在使用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表达式的其他部分。我只是不知道如何将包含的lambda转换为或lambda,评估传入列表以生成条件。

您可以利用运行时生成的字符串进行查询。 基本上,扩展方法套件允许您将linq静态语句编码为在执行时编译的字符串。

您可以利用运行时生成的字符串进行查询。
基本上,扩展方法套件允许您将linq静态语句编码为在执行时编译的字符串。

您应该以这种方式创建一个新的表达式。类似如下:

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;
}

希望有帮助。

您应该以这种方式创建一个新表达式。类似于:

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;
}

希望有帮助。

Contains在这种情况下肯定会起作用。否。DataServiceQuery不知道如何将其转换为OData URI。Contains在这种情况下肯定会起作用。否。DataServiceQuery不知道如何将其转换为OData URI。这很有帮助。评估列表本身的部分没有按预期工作,但我找到以下内容来解决此问题:这很有帮助。评估列表本身的部分没有按预期工作,但我找到以下内容来解决此问题: