LINQ Запрос, если условие внешний параметр - PullRequest
4 голосов
/ 21 января 2020

Я пытаюсь использовать LINQ для получения списка значений.

У меня есть такой код:

var _context = _scope.ServiceProvider.GetRequiredService<VMContext>();

if (boolparameter)
{
    var listCE = _context.Ce
                         .Where(x => x.VuId == element.VuId)
                         .Where(x => x.Score == 8)
                         .AsNoTracking()
                         .ToList();
}
else
{
    var listCE = _context.Ce
                         .Where(x => x.VuId == element.VuId)
                         .AsNoTracking()
                         .ToList();
}

Зависит от параметра boolparamet, я делаю запрос или другой. Есть ли способ использовать один запрос с условиями внутри? Примерно так:

var listCE = _context.Ce
                     .Where(x => x.VuId == element.VuId)
                     .Where(x => boolparameter ? x.Score == 8 : true)
                     .AsNoTracking()
                     .ToList();

C# Asp .NetCore SqlServer 2019 Большое спасибо!

Ответы [ 4 ]

5 голосов
/ 21 января 2020

Вы можете попробовать следующий код, если он работает:

var listCE = _context.Ce
  .Where(x => x.VuId == element.VuId)
  .Where(x => !boolparameter || x.Score == 8)
  .AsNoTracking()
  .ToList();

Это означает, что если boolparameter равно false, x.Score не имеет значения, поскольку !false будет равно true и он удовлетворяет условию ИЛИ. Аналогично, если boolparameter равно true, то x.score также будет проверяться, если оно равно 8.

Или, возможно, с одним условием Where:

var listCE = _context.Ce
  .Where(x => x.VuId == element.VuId && (!boolparameter || x.Score == 8))
  .AsNoTracking()
  .ToList();
1 голос
/ 21 января 2020

Можете ли вы проверить это ниже?

var listCE = _context.Ce
        .Where(x => boolparameter == false ? x.VuId == element.VuId : 
        (x.VuId == element.VuId && 
        x.Score == 8)) 
        .AsNoTracking()
        .ToList();     
1 голос
/ 21 января 2020
var listCE = _context.Ce
    .Where(x =>
        x.VuId == element.VuId
        && (!boolparameter || x.Score == 8))
    .AsNoTracking()
    .ToList();

Это проверяет, является ли boolparameter истинным перед проверкой x.Score.

0 голосов
/ 21 января 2020

Этот способ более многословен, но если у вас более (или сложные) условия, вам будет легче прочитать и быстрее понять, что влияет на запрос. LINQ не выполнит запрос, пока вы не достигнете .ToList() или не попытаетесь получить доступ к результату запроса.

Это означает, что вам не нужно дублировать полный запрос в части if и else:

var _context = _scope.ServiceProvider.GetRequiredService<VMContext>();

var listCEQuery = _context.Ce.Where(x => x.VuId == element.VuId)

// LINQ will append this to the initial where clause   
if (boolparameter == true)
    listCEQuery = listCEQuery.Where(x => x.Score == 8)

var listCE = listCEQuery.AsNoTracking().ToList();
...