Несколько предложение WHERE в Linq

Я новичок в 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();

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

66 голосов | спросил Ganesha 25 MaramWed, 25 Mar 2009 02:20:11 +03002009-03-25T02:20:11+03:0002 2009, 02:20:11

4 ответа


0

Ну, вы можете просто вставить несколько предложений "где" напрямую, но я не думаю, что вы захотите. Несколько предложений "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 вызов занимает много времени, но если коллекция достаточно мала, это не будет иметь больших шансов.

ответил Jon Skeet 25 MaramWed, 25 Mar 2009 02:24:50 +03002009-03-25T02:24:50+03:0002 2009, 02:24:50
0

@Theo

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

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

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

ответил alex 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 21 Sep 2012 10:48:19 +0400 2012, 10:48:19
0

@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 подзапросах, т.е. Переводчик достаточно умён, чтобы выполнить .Where(r=>r.UserName!="XXXX").Where(r=>r.UserName!="YYYY)

ответил Theodore Zographos 20 +04002010-10-20T15:33:39+04:00312010bEurope/MoscowWed, 20 Oct 2010 15:33:39 +0400 2010, 15:33:39
0

Кроме того, вы можете использовать метод 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;
}
ответил tolpp 3 42011vEurope/Moscow11bEurope/MoscowThu, 03 Nov 2011 00:43:16 +0400 2011, 00:43:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132