使用Or操作数组合一些lambda表达式

本文关键字:lambda 表达式 合一 数组 Or 操作 操作数 使用 | 更新日期: 2023-09-27 18:00:38

我想创建一个动态表达式,该表达式将由未知数量的Or条件生成:

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

我试图实现Or扩展,但无法想出一个合乎逻辑的方法。

此外,我还在玩PredicateBuilder,并写了一些类似的东西:

var predicate = PredicateBuilder.False<Entity>();

下面的代码在我的循环中:

predicate = predicate.Or(filter);

然而,我意识到这只是And的条件加在一起,而不是Or的条件。。。。

知道如何生成组合表达式吗
关于

编辑:
我写的原始代码:

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

生成的实体。当queryObjects有两个元素=时,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)))}

使用Or操作数组合一些lambda表达式

使用PredicateBuilder.Or当然应该是"answers"一起使用结果。

您当前在主要代码片段中获得的代码不会编译,因为您使用的是wholeFilter,而没有为其分配初始值。此外,我不知道Expression<TDelegate>上有任何名为Or的实例或扩展方法。

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