Linq中的多个WHERE子句


75

我是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();

我在这里先向您的帮助表示感谢!!!

Answers:


115

好吧,您可以直接在其中放置多个“ where”子句,但我认为您不想这样做。多“其中”条款有最终严格的过滤器-我想你想限制性的。我认为您确实想要:

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并且您想选择该行用户名不是YYYY,则要。

编辑:如果您有一个完整的集合,它甚至更容易。假设该集合称为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>为a以避免Contains通话花费很长时间,但是如果集合足够小,则不会有太大的优势。


我有一个用户名集合。如何将其动态传递给where子句。
甘尼萨(Ganesha)2009年

1
我知道很久以前就回答了这个问题,但是我的快速建议是尝试使用连接而不是包含。效率更高(尤其是如果您包含的数据集是任何合理的大小)。
人造金

46

@西奥

LINQ转换器足够智能,可以执行:

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

我已经在LinqPad中测试了此==>是的,Linq转换器足够聪明:))


足够聪明意味着Linq拥有额外的过滤器,这对性能造成了影响。
安德烈斯·托罗

20

@Jon: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;

就结果而言,我认为它们是等效的。

但是,我还没有测试过,如果在第一个示例中使用多个where导致2个子查询,即.Where(r=>r.UserName!="XXXX").Where(r=>r.UserName!="YYYY)LINQ转换器足够聪明地执行.Where(r=>r.UserName!="XXXX" && r.UsernName!="YYYY")


6

另外,您可以使用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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.