Linq中有多个WHERE子句

我是LINQ的新手,想知道如何执行多个where子句。 这是我想实现的:通过筛选出某些用户名来返回logging。 我试了下面的代码,但没有按预期工作。

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

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

那么,你可以直接放置多个“where”子句,但我不认为你想要。 多个“where”子句以严格的filter结束 – 我想你想要一个限制较less的filter。 我想你真的想要:

 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,则要select该行。

编辑:如果你有一个完整的集合,它甚至更容易。 假设集合被称为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调用需要很长时间,但是如果集合足够小,则不会有太大的可能性。

@Theo

LINQ翻译器足够聪明,可以执行:

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

我已经在LinqPadtesting了这个==>是的,Linq翻译是足够智能:))

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; 

我认为,就结果而言,它们是相当的。

但是,我还没有testing过,如果在第一个例子中使用多个where引起的子查询,即.Where(r=>r.UserName!="XXXX").Where(r=>r.UserName!="YYYY)或者LINQ翻译器足够聪明,可以执行.Where(r=>r.UserName!="XXXX" && r.UsernName!="YYYY")

另外,你可以使用bool方法(s)

查询:

 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; }