RavenDB - 使用OR过滤器构建动态查询

Phi*_*hil 3 c# linq ravendb

我需要能够在运行时使用OR语句构建查询.如果我使用下面的方法来构建查询,那么一切都是AND.我真的需要每个过滤器值为OR才能使此查询正常工作.

public class IdAndRole
{
    public string Id {get;set;}
    public string Role {get;set;}
}

var idAndRoles = session.Query<IdAndRole, Roles_ById>();
foreach(var filter in filterValues)
{
    idAndRoles = idAndRoles.Where(x => x.In(filter.Id) && x.In(filter.Role));
}
Run Code Online (Sandbox Code Playgroud)

伪代码:

(filter[0].Id == value1 && filter[0].Role == role1) ||(filter[1].Id == value2 && filter[1].Role == role2)
Run Code Online (Sandbox Code Playgroud)

tva*_*son 5

您应该能够使用PredicateBuilder来构造查询.

var predicate = PredicateBuilder.False<IdAndRole>();
foreach (var filter in filterValues)
{
     predicate = predicate.Or( x => x.In(filter.Id) && x.In(filter.Role) );
}

var idAndRoles = session.Query<IdAndRole,Roles_byId>()
                        .Where( predicate );
Run Code Online (Sandbox Code Playgroud)

  • @Phil - 不,但你可以得到消息来源.它构建了一个应该工作正常的表达式.我正在使用一些类似的技术在我的一个RavenDB项目中构建表达式. (3认同)