《linq体验(8)——linq to sql语句之union allunionintersect和topbottom和paging和sqlmethods》由会员分享,可在线阅读,更多相关《linq体验(8)——linq to sql语句之union allunionintersect和topbottom和paging和sqlmethods(6页珍藏版)》请在金锄头文库上搜索。
1、我们继续讲解 LINQ to SQL 语句,这篇我们来讨论 Union All/Union/Intersect 操作和 Top/Bottom 操作和 Paging 操作和 SqlMethods 操作 。Union All/Union/Intersect 操作适用场景:对两个集合的处理,例如追加、合并、取相同项、相交项等等。Concat(连接)说明:连接不同的集合,不会自动过滤相同项;延迟。1.简 单 形 式 :var q = (from c in db.Customersselect c.Phone).Concat(from c in db.Customersselect c.Fax).Con
2、cat(from e in db.Employeesselect e.HomePhone);语句描述:返回所有消费者和雇员的电话和传真。2.复 合 形 式 :var q = (from c in db.Customersselect newName = c.CompanyName,c.Phone).Concat(from e in db.Employeesselect newName = e.FirstName + + e.LastName, Phone = e.HomePhone);语句描述:返回所有消费者和雇员的姓名和电话。Union(合并)说明:连接不同的集合,自动过滤相同项;延迟。即是
3、将两个集合进行合并操作,过滤相同的项。var q = (from c in db.Customersselect c.Country).Union(from e in db.Employeesselect e.Country);语句描述:查询顾客和职员所在的国家。Intersect(相交)说明:取相交项;延迟。即是获取不同集合的相同项(交集)。即先遍历第一个集合,找出所有唯一的元素,然后遍历第二个集合,并将每个元素与前面找出的元素作对比,返回所有在两个集合内都出现的元素。var q = (from c in db.Customersselect c.Country).Intersect(fro
4、m e in db.Employeesselect e.Country);语句描述:查询顾客和职员同在的国家。Except(与非)说明:排除相交项;延迟。即是从某集合中删除与另一个集合中相同的项。先遍历第一个集合,找出所有唯一的元素,然后再遍历第二个集合,返回第二个集合中所有未出现在前面所得元素集合中的元素。var q = (from c in db.Customersselect c.Country).Except(from e in db.Employeesselect e.Country);语句描述:查询顾客和职员不同的国家。Top/Bottom 操作适用场景:适量的取出自己想要的数据,
5、不是全部取出,这样性能有所加强。Take说明:获取集合的前 n 个元素;延迟。即只返回限定数量的结果集。var q = (from e in db.Employeesorderby e.HireDateselect e).Take(5);语句描述:选择所雇用的前 5 个雇员。Skip说明:跳过集合的前 n 个元素;延迟。即我们跳过给定的数目返回后面的结果集。var q = (from p in db.Productsorderby p.UnitPrice descendingselect p).Skip(10);语句描述:选择 10 种最贵产品之外的所有产品。TakeWhile说明:直到某一条
6、件成立就停止获取;延迟。即用其条件去依次判断源序列中的元素,返回符合判断条件的元素,该判断操作将在返回 false 或源序列的末尾结束 。SkipWhile说明:直到某一条件成立就停止跳过;延迟。即用其条件去判断源序列中的元素并且跳过第一个符合判断条件的元素,一旦判断返回 false,接下来将不再进行判断并返回剩下的所有元素。Paging(分页)操作适用场景:结合 Skip 和 Take 就可实现对数据分页操作。1.索 引var q = (from c in db.Customersorderby c.ContactNameselect c).Skip(50).Take(10);语句描述:使用
7、 Skip 和 Take 运算符进行分页,跳过前 50 条记录,然后返回接下来 10 条记录,因此提供显示 Products 表第 6 页的数据。2.按 唯 一 键 排 序var q = (from p in db.Productswhere p.ProductID 50orderby p.ProductIDselect p).Take(10);语句描述:使用 Where 子句和 Take 运算符进行分页,首先筛选得到仅 50 (第 5 页最后一个 ProductID)以上的 ProductID,然后按 ProductID 排序,最后取前 10 个结果,因此提供 Products 表第 6 页
8、的数据。请注意,此方法仅适用于按唯一键排序的情况。SqlMethods 操作在 LINQ to SQL 语句中,为我们提供了 SqlMethods 操作,进一步为我们提供了方便,例如 Like 方法用于自定义通配表达式,Equals 用于相比较是否相等。Like自定义的通配表达式。%表示零长度或任意长度的字符串;_表示一个字符; 表示在某范围区间的一个字符; 表示不在某范围区间的一个字符。比如查询消费者 ID 以“C”开头的消费者。 var q = from c in db.Customerswhere SqlMethods.Like(c.CustomerID, C%)select c;比如查
9、询消费者 ID 没有“AXOXT”形式的消费者:var q = from c in db.Customerswhere !SqlMethods.Like(c.CustomerID, A_O_T)select c;DateDiffDay说明:在两个变量之间比较。分别有:DateDiffDay、DateDiffHour 、DateDiffMillisecond、DateDiffMinute、DateDiffMonth、DateDiffSecond、DateDiffYear var q = from o in db.Orderswhere SqlMethods.DateDiffDay(o.OrderDate, o.ShippedDate) from c in db2.Customers where c.City = cityselect c);/2.查询城市为 London 的消费者,用 LonCusts 集合表示,这时可以用数据控件绑定var LonCusts = fn(db, London);/3.查询城市为 Seattle 的消费者var SeaCusts = fn(db, Seattle);语句描述:这个例子创建一个已编译查询,然后使用它检索输入城市的客户。