LINQ基础——WHERE子句
一、简介
将一个布尔条件("谓词")应用于每个源元素(由范围变量引用),并返回满足指定条件的元素。
适用场景:实现过滤,查询等功能。
说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句。
Where操作包括3种形式,分别为:简单形式、关系条件形式、First()形式。
二、案例
简单形式
使用where筛选在伦敦的客户:
var q = from c in db.Customers where c.City == "London" select c;
筛选2000年或之后雇用的雇员:
var q = from e in db.Employees where e.HireDate >= new DateTime(2000, 1, 1) select e;
关系条件形式
筛选库存量在订货点水平之下但未断货的产品:
var q = from p in db.Products where p.UnitsInStock <= p.ReorderLevel && !p.Discontinued select p;
筛选出UnitPrice 大于10 或已停产的产品:
var q = from p in db.Products where p.UnitPrice > 10m || p.Discontinued select p;
下面这个例子是调用两次where以筛选出UnitPrice大于10且已停产的产品:
var q = db.Products.Where(p=>p.UnitPrice > 10m).Where(p=>p.Discontinued);
First()形式
返回集合中的一个元素,其实质就是在SQL语句中加TOP (1)。
简单用法:
选择表中的第一个发货方。
Shipper shipper = db.Shippers.First();
元素:
选择CustomerID 为“BONAP”的单个客户
Customer cust = db.Customers.First(c => c.CustomerID == "BONAP");
条件:
选择运费大于 100.00 的订单:
Order ord = db.Orders.First(o => o.Freight > 100.00M);
WHERE的其他案例
将数组中小于5的偶数查询出来输出到控制台
//数据源 int[] arr = { 0, 3, 2, 1, 9, 6, 8, 7, 4, 5 }; //使用Where子句查询的查询语句 var query = from a in arr where a < 5 && a % 2 == 0 select a; //执行查询 foreach (var a in query) { Console.WriteLine(a); }
分析:
首先遍历数组中的每个元素,然后用where语句筛选出小于5,并且对2去模是0的数查询出来返回。
where子句不仅能使用表达式来进行筛选,还可以使用方法进行筛选。
public static bool IsEven(int a) { return a % 2 == 0 ? true : false; }
//数据源 int[] arr = { 0, 3, 2, 1, 9, 6, 8, 7, 4, 5 }; //where子句也可以接受一个方法 var query = from a in arr where IsEven(a) select a; foreach (var a in query) { Console.Write(a + ","); }
这就是一个在where语句中使用方法进行筛选的例子,输出的结果和上例完全一样。
三、总结
使用where子句还要注意以下几点:
1.一个查询表达式可以包含多个where子句
2.where子句是一种筛选机制。除了不能是第一个或最后一个子句外,它几乎可以放在查询表达式中的任何位置。where子句可以出现在group子句的前面或后面,具体情况取决于是3.必须在对源元素进行分组之前还是分组之后来筛选源元素。
4.如果指定的谓词对于数据源中的元素无效,则会发生编译时错误。这是Linq提供的强类型检查的一个优点。
5.编译时,where关键字会被转换为对where标准查询运算符方法的调用。