2013-10-11 2 views
1

У меня есть следующая инструкция LINQ, которая действует на where на date и LabID.Только делать Если условие, если значение передано в

Я прохожу список ЛАБОРАТОРИЙ и дату, однако они не требуются, и я могу потенциально только пройти дату, и никакой лаборатории, и в этом случае я бы хотел получить результаты для всех лабораторий для этой конкретной лаборатории.

вот что я сейчас:

List<dExp> lstDatExp = (from l in ctx.dExp.Include("datLab") 
         where values.Contains(l.datL.Lab_ID) 
          && l.reportingPeriod == reportingPeriod 
         select l).ToList<dExp>(); 

Но это ломает, если значение получения прошло в не существует. Как изменить это, чтобы убедиться, что оба моих оператора where являются необязательными?

+1

ли 'values' ваши LABS? Пожалуйста, будьте последовательны в именовании. –

ответ

5

С IQueryable вы можете просто добавить условия ступенчато:

int? reportingPeriod = ...; 

IQueryable<dExp> resultsQuery =   // don't use `var` here. 
     ctx.dExp.Include("datLab"); 

if (values != null) 
    resultsQuery = resultsQuery.Where(exp => values.Contains(exp.datL.Lab_ID)); 

if (reportingPeriod.Hasvalue) 
    resultsQuery = resultsQuery.Where(exp => exp.reportingPeriod == reportingPeriod.Value); 

// additional .Where(), .OrderBy(), .Take(), .Skip() and .Select() 

// The SQL query is made and executed on the line below 
// inspect the string value in the debugger 
List<dExp> results = resultsQuery.ToList(); 
+2

Я думаю, что этот человек чище, а потом я забыл про это так. –

+1

, который отлично работал. Спасибо. я не знал, что могу разбить его на несколько строк, это определенно легче читать так. –

2

Что мы делаем, это что-то вроде (l.reportingPeriod == reportingPeriod || reportingPeriod == null) Таким образом, вы проверяете, является ли параметр значением по умолчанию, который он не использовался, или если что-то там проверит его против база данных.

+0

ну, вы бы просто сделали другое или значение. Состояния (l.datL.Lab_ID) || values ​​= null), если им не хватает чего-то, что может быть. –

+0

Я удалил свой комментарий. Я неправильно понял ваше состояние. – Francis

1

Перед выполнением запроса необходимо проверить, не являются ли ваши значения нулевыми, и если они есть, не выполняйте дополнительное условие.

List<dExp> lstDatExp = 
    (from l in ctx.dExp.Include("datLab") 
    where 
     (values == null || values.Contains(l.datL.Lab_ID)) && 
     (reportingPeriod == null || l.reportingPeriod == reportingPeriod) 
    select l).ToList<dExp>(); 

Таким образом, если values или reportingPeriod равны нулю, они, по существу, по желанию.

+0

спасибо, теперь, когда я передаю оба значения (для лаборатории и отчетного периода), я получаю следующую ошибку. Не могу сравнить элементы типа «System.Collections.Generic.List'1». Поддерживаются только примитивные типы (такие как Int32, String и Guid) и типы сущностей. –

3

Вот два способа сделать это.

Но сначала, пожалуйста, не используйте ни один строчный регистр l в качестве идентификатора. Слишком легко путать его с номером 1. В более общем плане, stp, используя abbrevs в yr cde, он передает hrdr в rd.

Первый метод:

var query = from lab in ctx.dExp.Include("datLab") 
      where values == null || values.Contains(lab.datL.Lab_ID) 
      where reportingPeriod == null || lab.reportingPeriod == reportingPeriod 
      select lab; 
var list = query.ToList<dExp>(); 

Второй метод:

IEnumerable<dExp> query = ctx.dExp.Include("datLab"); 
if (values != null) 
    query = query.Where(lab=>values.Contains(lab.datL.Lab_ID)); 
if (reportingPeriod != null) 
    query = query.Where(lab=>lab.reportingPeriod == reportingPeriod); 
var list = query.ToList<dExp>(); 
+0

Я не думаю, что вы хотите 'IEnumerable <>' во втором. Данные поступают из Db. –

+0

@HenkHolterman: Хорошая точка. «IQueryable». –

Смежные вопросы