Цепочка / построение LINQ-запроса с ИЛИ вместо И

c# linq linq-to-entities

109 просмотра

2 ответа

7767 Репутация автора

Отредактировано, чтобы быть более понятным.

Если, например, у меня есть этот IQueryable:

DateTime theDate = new DateTime(2015, 09, 30);

var query = from org in Organisations
            where org.DisableOrganisation == false &&
              org.DisableReports == false
            select new
            {
                OrganisationId = org.OrganisationId
            };

и позже в методе я хочу добавить к нему ИЛИ, например

// Check to see if the date is the last day of the month.
if (theDate.AddDays(1).Day == 1)
{
    // The following statement introduces an AND but I want to make this an OR.
    query = query.Where(x => x.Frequency == "M");
}

Это эффективно делает мой запрос ...

var query = from org in Organisations
            where org.DisableOrganisation == false &&
              org.DisableReports == false &&
              org.Frequency == "M"
            select new
            {
                OrganisationId = org.OrganisationId
            };

но я хочу сделать это ...

var query = from org in Organisations
            where (org.DisableOrganisation == false &&
              org.DisableReports == false) ||
              org.Frequency == "M"
            select new
            {
                OrganisationId = org.OrganisationId
            };

Как мне сделать это ИЛИ вместо И?

PS Не могу использовать PredicateBuilder, так как по сути это LinqKit, который имеет зависимость от EntityFramework (≥ 6.0.2), я застрял с использованием EF 4.3.1

РЕШЕНО: Спасибо D Stanley (если честно, раньше я использовал эту форму решения, я просто забыл об этом).

DateTime theDate = new DateTime(2015, 09, 30);
bool isEndOfMonth = theDate.AddDays(1).Day == 1;

var query = from org in Organisations
            where (org.DisableOrganisation == false &&
              org.DisableReports == false) ||
              (isEndOfMonth &&
               pr.ProfileType == "L" && 
               pr.Frequency == "M")
            select new
            {
                OrganisationId = org.OrganisationId
            };
Автор: Paul Zahra Источник Размещён: 30.09.2015 12:28

Ответы (2)


1 плюс

128579 Репутация автора

Решение

Вы не можете сделать это с помощью цепочки - вам придется использовать какой-то конструктор выражений или просто встроить его в свой оригинальный фильтр:

var day = theDate.AddDays(1).Day;

var query = from org in Organisations
            where (org.DisableOrganisation == false &&
                   org.DisableReports == false) ||
                  (day == 1 &&
                   org.ProfileType == "L" && 
                   org.Frequency == "M")
            select new
            {
                OrganisationId = org.OrganisationId
            };
Автор: D Stanley Размещён: 30.09.2015 12:36

2 плюса

13130 Репутация автора

Чтобы объединить условия с OR вместо AND, используйте PredicateBuilder:

predicate = predicate.Or(p => p.Description.Contains (temp));
return dataContext.Products.Where(predicate);
Автор: Ilya Chumakov Размещён: 30.09.2015 12:38
Вопросы из категории :
32x32