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# 使用或操作数组合某些lambda表达式_C#_Linq_C# 4.0_Expression_Expression Trees - Fatal编程技术网

C# 使用或操作数组合某些lambda表达式

C# 使用或操作数组合某些lambda表达式,c#,linq,c#-4.0,expression,expression-trees,C#,Linq,C# 4.0,Expression,Expression Trees,我想制作一个动态表达式,它将由未知数量的或条件生成: IQueryable<Entity> entities = Repository<Entity>.Load(); Expression<Func<Entity, bool>> wholeFilter; foreach(condition in Conditions) { Expression<Func<Entity

我想制作一个动态表达式,它将由未知数量的
条件生成:

    IQueryable<Entity> entities = Repository<Entity>.Load();

    Expression<Func<Entity, bool>> wholeFilter;

    foreach(condition in Conditions)
    {           
      Expression<Func<Entity, bool>> filter = e => e.something1 == condition.First && e.something2 == condition.Second
      wholeFilter = wholeFilter.Or(filter)
    }

    return entities.Where(wholeFilter);
下面是我循环中的代码:

predicate = predicate.Or(filter);
然而,我意识到它只是将条件结合在一起,而不是将它们结合在一起

知道如何生成组合表达式吗?
问候

编辑:
我编写的原始代码:

public IQueryable<IEntity> Find(IEntityType entityType, List<AdaptiveObjectModelSpecification> queryObjecs)
{
    if (entityType == null)
        return null;

    var predicate = PredicateBuilder.False<IEntity>();
    var entities = Repository<IEntity>.Find(p => p.EntityType == entityType);

    if (queryObjecs != null)
    {
        foreach (var queryObject in queryObjecs)
        {
            if (entityType.PropertyTypes.Count(p => p.PropertyName == queryObject.PropertyType.PropertyName) == 0)
                throw new MissingFieldException(String.Format("Column {0} not found.", queryObject.PropertyType.PropertyName));

            predicate = predicate.Or(e => e.Properties.Any(p => p.Value == queryObject.SearchValue && p.PropertyType.PropertyName == queryObject.PropertyType.PropertyName));
        }
        entities = entities.Where(predicate);            
    }

    return entities;
}
publicIQueryable查找(entityType entityType,List queryObjecs)
{
if(entityType==null)
返回null;
var predicate=PredicateBuilder.False();
var entities=Repository.Find(p=>p.EntityType==EntityType);
if(queryObjecs!=null)
{
foreach(queryObject中的变量queryObject)
{
if(entityType.PropertyTypes.Count(p=>p.PropertyName==queryObject.PropertyType.PropertyName)==0)
抛出新的MissingFieldException(String.Format(“未找到列{0}.”,queryObject.PropertyType.PropertyName));
谓词=谓词。或(e=>e.Properties.Any(p=>p.Value==queryObject.SearchValue&&p.PropertyType.PropertyName==queryObject.PropertyType.PropertyName));
}
实体=实体。其中(谓词);
}
返回实体;
}
QueryObject有两个元素时生成的entities.Expression.ToString()=

{value(NHibernate.Linq.NhQueryable`1[Azarakhsh.Domain.Core.AdaptiveObjectModel.Interface.IEntity])

.Where(p => (p.EntityType == value(Azarakhsh.Domain.Core.AdaptiveObjectModel.Service.AdaptiveObjectModelRepositoryService+<>c__DisplayClassd).entityType))
// The line below is generated by PredicateBuilder 
.Where(
Param_0 => ((False
OrElse 
Invoke(e => e.Properties.Any(p => ((p.Value == value(Azarakhsh.Domain.Core.AdaptiveObjectModel.Service.AdaptiveObjectModelRepositoryService+<>c__DisplayClass10).queryObject.SearchValue) AndAlso (p.PropertyType.PropertyName == value(Azarakhsh.Domain.Core.AdaptiveObjectModel.Service.AdaptiveObjectModelRepositoryService+<>c__DisplayClass10).queryObject.PropertyType.PropertyName))), Param_0)) 
OrElse 
Invoke(e => e.Properties.Any(p => ((p.Value == value(Azarakhsh.Domain.Core.AdaptiveObjectModel.Service.AdaptiveObjectModelRepositoryService+<>c__DisplayClass10).queryObject.SearchValue) AndAlso (p.PropertyType.PropertyName == value(Azarakhsh.Domain.Core.AdaptiveObjectModel.Service.AdaptiveObjectModelRepositoryService+<>c__DisplayClass10).queryObject.PropertyType.PropertyName))), Param_0)))}
{value(NHibernate.Linq.NhQueryable`1[Azarakhsh.Domain.Core.AdaptiveObjectModel.Interface.IEntity])
.Where(p=>(p.EntityType==值(Azarakhsh.Domain.Core.AdaptiveObjectModel.Service.AdaptiveObjectModelRepositoryService+c_uDisplayClassD).EntityType))
//下面的行是由PredicateBuilder生成的
.在哪里(
参数0=>((假
奥莱尔斯
调用(e=>e.Properties.Any(p=>((p.Value==Value(Azarakhsh.Domain.Core.AdaptiveObjectModel.Service.AdaptiveObjectModelRepositoryService+c_uDisplayClass10)、queryObject.SearchValue)和(p.PropertyType.PropertyName==Value(Azarakhsh.Domain.Core.AdaptiveObjectModelRepositoryService+c_uDisplayClass10).queryObject.PropertyType.PropertyName))),参数(0)
奥莱尔斯
调用(e=>e.Properties.Any(p=>((p.Value==Value(Azarakhsh.Domain.Core.AdaptiveObjectModel.Service.AdaptiveObjectModelRepositoryService+c_uDisplayClass10)、queryObject.SearchValue)和(p.PropertyType.PropertyName==Value(Azarakhsh.Domain.Core.AdaptiveObjectModelRepositoryService+c_uDisplayClass10).queryObject.PropertyType.PropertyName))),参数(0))}

使用
PredicateBuilder.Or
当然应该将结果“和”-组合在一起

您当前在主要代码段中获得的代码将无法编译,因为您使用的是
wholeFilter
,而没有为其分配初始值—此外,我不知道有任何实例或扩展方法在
表达式上被称为


我会坚持使用PredicateBuilder,并找出它不起作用的原因——因为它当然应该起作用。请使用
PredicateBuilder
发布一些代码,以及它生成的SQL。

使用
PredicateBuilder。或者
当然应该是“和”-将结果合并在一起

您当前在主要代码段中获得的代码将无法编译,因为您使用的是
wholeFilter
,而没有为其分配初始值—此外,我不知道有任何实例或扩展方法在
表达式上被称为


我会坚持使用PredicateBuilder,并找出它不起作用的原因——因为它当然应该起作用。请使用PredicateBuilder发布一些代码,以及它生成的SQL。

您为什么从不接受答案?抱歉,但我认为实际答案应该标记为“已接受”。是吗?我是不是遗漏了什么?一切如我所料。。。不用说,我肯定会投票给一个与找到解决方案相关的帖子……你为什么从不接受答案?对不起,但我认为一个实际的答案应该标记为“接受”。是吗?我是不是遗漏了什么?一切如我所料。。。无需提及,我绝对支持与找到解决方案相关的帖子…公共静态表达式或(此表达式左,表达式右){LambdaExpression LambdaExpression=RebuildExpressionIfNeeded(left.Parameters[0],right);return Expression.Lambda(Expression.OrElse(left.Body,lambdaExpression.Body),right.Parameters);}抱歉迟到了。我很感谢你的通知。我编辑了这篇文章,所以它是原始的。查询的结果是最后一个可以满足queryObject的实体。因此,如果有3个匹配的实体,只会返回最后一个…而且,我不明白为什么PredicateBuilder。或者“and…”我不明白为什么你认为PredicateBuilder是“anding”表达式,当它在生成的表达式中明确使用OrElse时。有对AndAlso的引用,但这是因为您在表达式中使用了
&&
。@Jon:是的,它显然在使用OrElse。但是它不会返回所有匹配的实体,而是返回最后一个。假设有10个匹配的实体,这些实体从1到9不在返回的列表中。只有#10…我想它没有保留以前的结果。我在单元测试中遇到了这个问题。所以我确定数据…我可以用联合扩展方法管理它。但不幸的是,它在NHibernate 3.1公共静态表达式或(此表达式左,表达式右){LambdaExpression LambdaExpression=rebuildedexpressionifneeded(left.Parameters[0],right);返回Expression.Lambda(Expression.OrElse(left.Body,LambdaExpression
{value(NHibernate.Linq.NhQueryable`1[Azarakhsh.Domain.Core.AdaptiveObjectModel.Interface.IEntity])

.Where(p => (p.EntityType == value(Azarakhsh.Domain.Core.AdaptiveObjectModel.Service.AdaptiveObjectModelRepositoryService+<>c__DisplayClassd).entityType))
// The line below is generated by PredicateBuilder 
.Where(
Param_0 => ((False
OrElse 
Invoke(e => e.Properties.Any(p => ((p.Value == value(Azarakhsh.Domain.Core.AdaptiveObjectModel.Service.AdaptiveObjectModelRepositoryService+<>c__DisplayClass10).queryObject.SearchValue) AndAlso (p.PropertyType.PropertyName == value(Azarakhsh.Domain.Core.AdaptiveObjectModel.Service.AdaptiveObjectModelRepositoryService+<>c__DisplayClass10).queryObject.PropertyType.PropertyName))), Param_0)) 
OrElse 
Invoke(e => e.Properties.Any(p => ((p.Value == value(Azarakhsh.Domain.Core.AdaptiveObjectModel.Service.AdaptiveObjectModelRepositoryService+<>c__DisplayClass10).queryObject.SearchValue) AndAlso (p.PropertyType.PropertyName == value(Azarakhsh.Domain.Core.AdaptiveObjectModel.Service.AdaptiveObjectModelRepositoryService+<>c__DisplayClass10).queryObject.PropertyType.PropertyName))), Param_0)))}