当前位置:  开发笔记 > 编程语言 > 正文

Linq中的多个WHERE子句

如何解决《Linq中的多个WHERE子句》经验,为你挑选了4个好方法。

我是LINQ的新手,想知道如何执行多个where子句.这就是我想要实现的目的:通过过滤掉某些用户名来返回记录.我尝试了下面的代码但没有按预期工作.

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

            DataTable newDT = query.CopyToDataTable();

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



1> Jon Skeet..:

好吧,你可以直接添加多个"where"子句,但我认为你不想这样做.多个"where"子句最终会有一个限制性更强的过滤器 - 我认为你想要一个限制较少的过滤器.我想你真的想要:

DataTable tempData = (DataTable)grdUsageRecords.DataSource;
var query = from r in tempData.AsEnumerable()
            where r.Field("UserName") != "XXXX" &&
                  r.Field("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("UserName"))
            select r;

DataTable newDT = query.CopyToDataTable();

理想情况下,你想要做到这一点,HashSet以避免Contains长时间的通话,但如果收集足够小,它将不会有太大的可能性.



2> 小智..:

@Theo

LINQ转换器非常智能,可以执行:

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

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



3> Theodore Zog..:

@Jon:Jon,你是说使用多个where子句,例如

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

比使用更具有痉挛性

var query = from r in tempData.AsEnumerable()
            where r.Field("UserName") != "XXXX" && r.Field("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")



4> Tolga Okur..:

此外,你可以使用bool方法

查询:

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

        DataTable newDT = query.CopyToDataTable();

方法:

bool isValid(string userName)
{
    if(userName == "XXXX" || userName == "YYYY")
        return false;
    else return true;
}

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有