Условные запросы Linq - PullRequest
       61

Условные запросы Linq

85 голосов
/ 14 августа 2008

Мы работаем над средством просмотра журнала. Использование будет иметь возможность фильтрации по пользователю, серьезности и т. Д. В дни Sql я бы добавил в строку запроса, но я хочу сделать это с Linq. Как я могу условно добавить оператор where?

Ответы [ 13 ]

0 голосов
/ 14 августа 2008

Ну, я подумал, что вы можете поместить условия фильтра в общий список предикатов:

    var list = new List<string> { "me", "you", "meyou", "mow" };

    var predicates = new List<Predicate<string>>();

    predicates.Add(i => i.Contains("me"));
    predicates.Add(i => i.EndsWith("w"));

    var results = new List<string>();

    foreach (var p in predicates)
        results.AddRange(from i in list where p.Invoke(i) select i);               

В результате получается список, содержащий «me», «meyou» и «mow».

Вы могли бы оптимизировать это, выполняя foreach с предикатами в совершенно другой функции, которая OR для всех предикатов.

0 голосов
/ 14 августа 2008

Вы можете использовать внешний метод:

var results =
    from rec in GetSomeRecs()
    where ConditionalCheck(rec)
    select rec;

...

bool ConditionalCheck( typeofRec input ) {
    ...
}

Это будет работать, но не может быть разбито на деревья выражений, что означает, что Linq to SQL будет запускать код проверки для каждой записи.

В качестве альтернативы:

var results =
    from rec in GetSomeRecs()
    where 
        (!filterBySeverity || rec.Severity == severity) &&
        (!filterByUser|| rec.User == user)
    select rec;

Это может работать в деревьях выражений, что означает, что Linq to SQL будет оптимизирован.

0 голосов
/ 14 августа 2008

Просто используйте оператор C # &&:

var items = dc.Users.Where(l => l.Date == DateTime.Today && l.Severity == "Critical")

Редактировать: Ах, нужно читать более внимательно. Вы хотели знать, как условно добавить дополнительные пункты. В таком случае я понятия не имею. :) Что бы я, вероятно, сделал, просто подготовил несколько запросов и выполнил правильный, в зависимости от того, что мне в итоге понадобилось.

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