Linq - NHibernate.Как объединить условия LINQ в группе с оператором OR.IQuerable.Concat альтернатива - PullRequest
1 голос
/ 17 ноября 2011

У меня есть IQuerable<MyEntity> и фильтры (список условий), которые я хочу применить к моему запросу.

Схематически я хочу получить вид

                               //First filter group              // Second filter group
QUERY = from MYTABLE where ( Name = "User" and Age = 19  ) OR ( Name = "Alex", and Age > 20 )

query = (query.Where(x => x.Name == value)
              .Where(x => x.Age  == value)
              .Where(x => x.Post == value)) 
        OR (
        (query.Where(x => x.Name == value)
              .Where(x => x.RegistrationDate == value)) 

Мне нужно создать IQuerable, который будет содержать результаты первой и второй группы фильтров (IQuerable).

Но я не могу выполнить сначала 1-ю группу фильтров, затем 2-ю группу и результаты конкатов, потому что после применения моих фильтров я должен выполнить несколько операций с IQuarable.

Я пытался создать запросы и query.Concat() с помощью main, но NHibernate не поддерживает этот метод

    public static IQueryable<IDevice> ApplyGroups(this IQueryable<IDevice> query, IList<ITerminalGroup> groups)
    {
        foreach (ITerminalGroup group in groups)
        {
            IQueryable<IDevice> groupQuery = query.AsQueryable();
            // apply to groupQuery conditions
            groupQuery = groupQuery.ApplyGroup(group);

            query = query.Concat(groupQuery);
        }
        return query;
    }

    static IQueryable<IDevice> ApplyGroup(this IQueryable<IDevice> query, ITerminalGroup group)
    {
        foreach (ITermGroupCondition condition in group.Conditions)
        {
             query = query.Where(x => x.SpecialAttributes.Any(sa => x.Id == condition.AttribId && sa.AttribValue.Equals(condition.Value)));
        }
        return query;
    }

Количество условий может отличаться, я не знаю заранее

Как объединить условия LINQ в группе с оператором ИЛИ?

1 Ответ

1 голос
/ 17 ноября 2011

Вы можете использовать PredicateBuilder , чтобы сделать это;объедините условия с методом PredicateBuilder.Or и передайте полученное условие методу Where.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...