Linq中的多个WHERE子句

时间:2009-03-24 23:20:11

标签: linq linq-to-sql

我是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 个答案:

答案 0 :(得分:106)

好吧,你可以直接添加多个“where”子句,但我认为你不想这样做。多个“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();

请注意&amp;&amp;而不是||。如果用户名不是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>以避免Contains调用需要很长时间,但如果收集的数量足够小,则不会产生太多赔率。

答案 1 :(得分:35)

@Theo

LINQ翻译器非常智能,可以执行:

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

我在LinqPad中测试了这个 ==&GT;是的,Linq翻译很聪明:))

答案 2 :(得分:19)

@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")

答案 3 :(得分: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;
}