Подтвердить что ты не робот

Условные предикаты в LINQ?

Есть ли способ объединить запросы в разделах if и else?

public List<MyClass> GetData(Category category, bool flag= true)
{
     IQueryable<MyClass> result;
     if (flag)
     {
        result =  Session.All<MyClass>()
                    .Where(mc => mc.Col.Equals(category.ToString()) && mc.FLAG);
     }
     else
     {
        result = Session.All<MyClass>()
                    .Where(mc => mc.Col.Equals(category.ToString()));
     }

     return result.ToList();
}
4b9b3361

Ответ 1

Конечно.

result =  Session.All<MyClass>()
                 .Where(mc => mc.Col.Equals(category.ToString()) && (!flag || mc.FLAG));

Вы можете определить логику перезаписи, создав матрицу допустимых результатов true:

▼ mc.FLAG   ► flag
            true     false
true        valid    valid
false       invalid  valid

Здесь вы видите, что условие действительно, если flag является ложным (оба равны true) или mc.FLAG - true.

Я бы также посоветовал сначала выполнить проверку флага, так как это лучший исполняющий предикат. Это может помешать второй проверке, если первые результаты будут ложными:

result =  Session.All<MyClass>()
                 .Where(mc => (!flag || mc.FLAG) && mc.Col.Equals(category.ToString());

Ответ 2

Вы можете связать Where условно.

public List<MyClass> GetData(Category category, bool flag = true)
{
    var result = Session.All<MyClass>()
        .Where(mc => mc.Col.Equals(category.ToString()));

    if (flag) {
        result = result.Where(mc => mc.FLAG);
    }

    return result.ToList();
}