Множественное предложение WHERE в Linq - PullRequest
68 голосов
/ 25 марта 2009

Я новичок в LINQ и хочу знать, как выполнить несколько операторов where. Вот чего я хочу добиться: возвращать записи, отфильтровывая определенные имена пользователей. Я попробовал код ниже, но не работает, как ожидалось.

DataTable tempData = (DataTable)grdUsageRecords.DataSource;
var query = from r in tempData.AsEnumerable()
            where ((r.Field<string>("UserName") != "XXXX") || (r.Field<string>("UserName") != "XXXX"))                            
            select r;    

            DataTable newDT = query.CopyToDataTable();

Заранее спасибо за помощь !!!

Ответы [ 4 ]

107 голосов
/ 25 марта 2009

Ну, вы можете просто вставить несколько предложений "где" напрямую, но я не думаю, что вы захотите. Множественные предложения "where" заканчиваются ограничительным фильтром more - я думаю, что вам нужен ограничительный less . Я думаю, что вы действительно хотите:

DataTable tempData = (DataTable)grdUsageRecords.DataSource;
var query = from r in tempData.AsEnumerable()
            where r.Field<string>("UserName") != "XXXX" &&
                  r.Field<string>("UserName") != "YYYY"
            select r;

DataTable newDT = query.CopyToDataTable();

Обратите внимание на && вместо ||. Вы хотите выбрать строку, если имя пользователя не XXXX и имя пользователя не ГГГГ.

РЕДАКТИРОВАТЬ: Если у вас есть целая коллекция, это даже проще. Предположим, что коллекция называется ignoredUserNames:

DataTable tempData = (DataTable)grdUsageRecords.DataSource;
var query = from r in tempData.AsEnumerable()
            where !ignoredUserNames.Contains(r.Field<string>("UserName"))
            select r;

DataTable newDT = query.CopyToDataTable();

В идеале вы хотели бы сделать это HashSet<string>, чтобы избежать вызова Contains, который занимал бы много времени, но если коллекция достаточно мала, это не будет иметь больших шансов.

35 голосов
/ 21 сентября 2012

@ Тео

Переводчик LINQ достаточно умен, чтобы выполнить:

.Where(r => r.UserName !="XXXX" && r.UsernName !="YYYY")

Я проверял это в LinqPad ==> ДА, Linq переводчик достаточно умен :))

19 голосов
/ 20 октября 2010

@ Jon: Джон, ты говоришь, используя несколько выражений where, например

var query = from r in tempData.AsEnumerable()
            where r.Field<string>("UserName") != "XXXX" 
            where r.Field<string>("UserName") != "YYYY"
            select r;

более сдержанный, чем

var query = from r in tempData.AsEnumerable()
            where r.Field<string>("UserName") != "XXXX" && r.Field<string>("UserName") != "YYYY"
            select r;

Я думаю, что они эквивалентны с точки зрения результата.

Однако я не проверял, если использовать множественное число, где в первом примере причина в 2 подзапросах, т.е.

6 голосов
/ 03 ноября 2011

Также вы можете использовать метод bool

Запрос:

DataTable tempData = (DataTable)grdUsageRecords.DataSource;
var query = from r in tempData.AsEnumerable()
            where isValid(Field<string>("UserName"))// && otherMethod() && otherMethod2()                           
            select r;   

        DataTable newDT = query.CopyToDataTable();

Метод:

bool isValid(string userName)
{
    if(userName == "XXXX" || userName == "YYYY")
        return false;
    else return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...