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# 具有多个(或)和(和)的PredicateBuilder_C#_Linq_Asp.net Mvc 4_Predicatebuilder - Fatal编程技术网

C# 具有多个(或)和(和)的PredicateBuilder

C# 具有多个(或)和(和)的PredicateBuilder,c#,linq,asp.net-mvc-4,predicatebuilder,C#,Linq,Asp.net Mvc 4,Predicatebuilder,我试图创建一个表达式来检索一个Store对象,该对象应该位于国家列表中,并且其Store.Id=X 我试图用下面的表达式来实现这一点,但它会返回数据库中存储的所有存储,我不知道我缺少了什么 public Expression<Func<Store, bool>> CreateExpression(List<Country> countries, long storeId) { var predicate = PredicateBuilder.False

我试图创建一个表达式来检索一个Store对象,该对象应该位于国家列表中,并且其Store.Id=X

我试图用下面的表达式来实现这一点,但它会返回数据库中存储的所有存储,我不知道我缺少了什么

public Expression<Func<Store, bool>> CreateExpression(List<Country> countries, long storeId)
{
    var predicate = PredicateBuilder.False<Store>();

    predicate = countries.Aggregate(predicate, (current, p) => 
        current.Or(e => e.Country.Id == p.Id));

    predicate = predicate.And(e => e.Id == storeId);

    return predicate;
}

这是因为您正在对所有e.Country.Id==p.Id进行ORing,如果这是真的,那么其他谓词就不重要了。然而,当你从False开始时,没有一个OR是真的,你将不会得到False&&something==Falsookey,ty作为解释,Ben!但是,你能给我举个例子吗?如果| a==1 | b==2&&c==3如果a是1或b是2,不管c是什么,表达式都是真的。如果c是3,a不是1,b不是2,那么表达式是假的,因为iffalse&&true是假的。哈哈,这很好,但是我问如何创建表达式,我的意思是,我必须创建例如predicate.And e=>e.Id==storeId&&这里检查country.Id是否在列表中?我刚才解释了为什么代码会给出它所能给出的结果。我认为您需要做的是将OR嵌套在一个内部谓词中,即逻辑上ifa==1 | | b==2&&c==3,这里的说明可能还需要从var predicate=PredicateBuilder.True开始;否则,您可能最终没有记录。