В Linq to EF 4.0 я хочу вернуть строки, соответствующие списку, или все строки, если список пуст. Как мне сделать это элегантно? - PullRequest
0 голосов
/ 30 сентября 2011

Такие вещи:

Dim MatchingValues() As Integer = {5, 6, 7}
Return From e in context.entity
       Where MatchingValues.Contains(e.Id)

... отлично работает.Однако в моем случае значения в MatchingValues ​​предоставляются пользователем.Если ничего не указано, все строки должны быть возвращены.Было бы замечательно, если бы я мог сделать это:

Return From e in context.entity
       Where (MatchingValues.Length = 0) OrElse (MatchingValues.Contains(e.Id))

Увы, тест длины массива нельзя преобразовать в SQL.Я мог бы, конечно, кодировать это:

If MatchingValues.Length = 0 Then
   Return From e in context.entity
Else
   Return From e in context.entity
          Where MatchingValues.Contains(e.Id)
End If

Это решение плохо масштабируется.Моему приложению нужно работать с 5 такими списками, а это значит, что мне нужно кодировать 32 запроса, по одному для каждой ситуации.

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

Там должен быть лучшим способом.Идеи?

1 Ответ

1 голос
/ 30 сентября 2011

Попробуйте: (простите за код C #, но вы поняли)

IQueryable<T> query = context.Entity;
if (matchingValues.Length < 0) {
    query = query.Where(e => matchingValues.Contains(e.Id));
}

Вы можете сделать это и с другими списками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...