2013-12-04 4 views
3
String Sex = getSex(); // return M or F 
String[] members = getMembers(); // return member codes in array or null 
//if members array is null, no filtering for member codes 
var query = from tb in MemberTable 
      where tb.sex.Equals(Sex) && 
        (members != null ? members.Contains(tb.membercode) : true) 
      select tb; 

Код не возвращает правильный результат. Он возвращает всех участников независимо от того, что такое members[].LINQ, где фильтрация условий

На самом деле оригинальный LINQ является сложным, так что если есть какие-либо другие возможные решения, я не хочу, чтобы написать следующее:

if (members == null){ /*LINQ1*/ } 
else { /*LINQ2*/ } 

, который не является хорошим стилем кодирования. Любое предложение для решения этой проблемы?

+0

Поддерживает ли ваш ORM тройной оператор? Я никогда не пробовал с ORM ..:/Что такое SQL, который получается из этого LINQ? –

ответ

8
var query = MemberTable.Where(x=>x.sex.Equals(Sex)) 

if (members != null) 
    query = query.Where(x=>members.Contains(x.membercode)) 

//use your query 
query.ToList(); 

ИЛИ

var query = from tb in MemberTable 
     where tb.sex.Equals(Sex) && 
       (members == null || members.Contains(tb.membercode)) 
     select tb; 

Я предпочитаю первый.

+2

Я определенно предпочитаю первый. Это лучшее решение, потому что он будет оценивать 'members! = Null' только один раз, а не для каждого элемента. – MarcinJuraszek

+0

Спасибо за ваше предложение. Могу ли я задать некоторые вопросы о методе 1? Кажется, что некоторые записи будут отсканированы дважды. Любая проблема с производительностью по сравнению с методом 2? – Pang

+1

Не будет записей, отсканированных несколько раз. То, что LINQ делает, - это просто создание объекта IQuerable, поэтому вы можете добавить столько вещей, сколько хотите. Он выполняется только тогда, когда вы _use_ it (ToList в этом примере). Пока вы не начнете потреблять результаты, это всего лишь объект запроса и ничего больше. –

2

С || короткого замыкания, вы должны быть в состоянии сделать это:

var query = from tb in MemberTable 
    where tb.sex.Equals(Sex) && 
      (members == null || members.Contains(tb.membercode)) 
    select tb; 

(members == null || members.Contains(tb.membercode)) Подвыражение будет true если members является null, поэтому Contains не будет оцениваться.

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