LINQ体验(8)——LINQ to SQL语句之Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods
\n
我们继续讲解LINQ语句,这篇我们来讨论Union All/Union/Intersect操作和Top/Bottom操作和Paging操作和SqlMethods操作。
\n
Union All/Union/Intersect操作
\n
适用场景:对两个集合的处理,例如追加、合并、取相同项、相交项等等。
\n
Concat(连接)
\n
说明:连接不同的集合,不会自动过滤相同项;延迟。
\n
1.简单形式:
var q = (
\n from c in db.Customers
\n select c.Phone
\n ).Concat(
\n from c in db.Customers
\n select c.Fax
\n ).Concat(
\n from e in db.Employees
\n select e.HomePhone
\n );
\n
语句描述:返回所有消费者和雇员的电话和传真。
\n
2.复合形式:
var q = (
\n from c in db.Customers
\n select new {Name = c.CompanyName, c.Phone}
\n ).Concat(
\n from e in db.Employees
\n select new {Name = e.FirstName + ” ” + e.LastName, Phone = e.HomePhone}
\n );
\n
语句描述:返回所有消费者和雇员的姓名和电话。
\n
Union(合并)
\n
说明:连接不同的集合,自动过滤相同项;延迟。即是将两个集合进行合并操作,过滤相同的项。
var q = (
\n from c in db.Customers
\n select c.Country
\n ).Union(
\n from e in db.Employees
\n select e.Country
\n );
\n
语句描述:查询顾客和职员所在的国家。
\n
Intersect(相交)
\n
说明:取相交项;延迟。即是获取不同集合的相同项(交集)。即先遍历第一个集合,找出所有唯一的元素,然后遍历第二个集合,并将每个元素与前面找出的元素作对比,返回所有在两个集合内都出现的元素。
var q = (
\n from c in db.Customers
\n select c.Country
\n ).Intersect(
\n from e in db.Employees
\n select e.Country
\n );
\n
语句描述:查询顾客和职员同在的国家。
\n
Except(与非)
\n
说明:排除相交项;延迟。即是从某集合中删除与另一个集合中相同的项。先遍历第一个集合,找出所有唯一的元素,然后再遍历第二个集合,返回第二个集合中所有未出现在前面所得元素集合中的元素。
var q = (
\n from c in db.Customers
\n select c.Country
\n ).Except(
\n from e in db.Employees
\n select e.Country
\n );
\n
语句描述:查询顾客和职员不同的国家。
\n
Top/Bottom操作
\n
适用场景:适量的取出自己想要的数据,不是全部取出,这样性能有所加强。
\n
Take
\n
说明:获取集合的前n个元素;延迟。即只返回限定数量的结果集。
var q = (
\n from e in db.Employees
\n orderby e.HireDate
\n select e)
\n .Take(5);
\n
语句描述:查询出最早5位雇用的雇员。
\n
Skip
\n
说明:跳过集合的前n个元素;延迟。即我们跳过给定的数目返回后面的结果集。
var q = (
\n from p in db.Products
\n orderby p.UnitPrice descending
\n select p)
\n .Skip(10);
\n
语句描述:查询出10个最贵的产品。
\n
TakeWhile
\n
说明:直到某一条件成立就停止获取;延迟。即用其条件去依次判断源序列中的元素,返回符合判断条件的元素,该判断操作将在返回false或源序列的末尾结束 。
\n
SkipWhile
\n
说明:直到某一条件成立就停止跳过;延迟。即用其条件去判断源序列中的元素并且跳过第一个符合判断条件的元素,一旦判断返回false,接下来将不再进行判断并返回剩下的所有元素。
\n
Paging(分页)操作
\n
适用场景:结合Skip和Take就可实现对数据分页操作。
var q = (
\n from c in db.Customers
\n orderby c.ContactName
\n select c)
\n .Skip(50)
\n .Take(10);
\n
语句描述:跳过前50条记录,取出接下来的10条记录,形成乘积表在第6页显示。
var q = (
\n from p in db.Products
\n where p.ProductID > 50
\n orderby p.ProductID
\n select p)
\n .Take(10);
\n
SqlMethods操作
\n
在LINQ to SQL语句中,为我们提供了SqlMethods操作,进一步为我们提供了方便,例如Like方法用于自定义通配表达式,Equals用于相比较是否相等。
\n
Like
\n
自定义的通配表达式。%表示零长度或任意长度的字符串;_表示一个字符;[]表示在某范围区间的一个字符;[^]表示不在某范围区间的一个字符。比如查询消费者ID以“C”开头的消费者。
var q = from c in db.Customers
\n where SqlMethods.Like(c.CustomerID, “C%”)
\n select c;
\n
比如查询消费者ID没有“AXOXT”形式的消费者:
var q = from c in db.Customers
\n where !SqlMethods.Like(c.CustomerID, “A_O_T”)
\n select c;
\n
DateDiffDay
\n
说明:在两个变量之间比较。分别有:DateDiffDay、DateDiffHour、DateDiffMillisecond、DateDiffMinute、DateDiffMonth、DateDiffSecond、DateDiffYear
var q = from o in db.Orders
\n where SqlMethods.DateDiffDay(o.OrderDate, o.ShippedDate) < 10
\n select o;
\n
语句描述:查询所有10天之内的订单。
\n
Compiled Query(查询编辑)操作
\n
说明:在之前我们没有好的方法对写出的SQL语句进行编辑重新查询,现在我们可以这样做,看下面一个例子:
//1.创建compiled query\n
\nNorthwindDataContext db = new NorthwindDataContext();
\nvar fn = CompiledQuery.Compile((NorthwindDataContext db2, string city) =>
\n from c in db2.Customers
\n where c.City == city
\n select c);
\n//2.查询城市为London的消费者,用LonCusts集合表示,这时可以用数据绑定控件绑定
\nvar LonCusts = fn(db, “London”);
\n//3.查询城市为Seattle的消费者
\nvar SeaCusts = fn(db, “Seattle”);