LINQ查询运算符可以处理内存中可查询的.NET类型实例。可查询的.NET类型是指那些实现IEnumerable接口或继承于IQueryable<T>泛型接口的类型。数组List、Dictionary及.NET Framework中的其他集合类型都是可查询的。
XML和DataSet不能直接查询,因为二者都没实现IEnumerable接口。为此,在使用前,我们需要对它们进行特殊处理,该过程会调用DataSet上的AsEnumerable方法和XML文档的XDocument.Load方法时执行。
LINQ与SqlCommand对象不同的是,在开始对数据进行操作时,查询才会隐式地执行。换言之,不必显式地执行命令,它会被延迟,直到遇到用于获取查询结果的代码。这种特性被称为查询的延迟执行。
如果合作ToList或ToArray方法将数据加载到.NET对象中,查询便会立即执行,不会被延迟:
var data = (from c in dataContext.Customers where c.Country = "Spain" select c).ToList();
最后注意,只有生成集合的查询会被延迟,若查询只获取某个标量,它会被立即执行。
1、Concat(连接不同的集合不会自动过滤相同项。会延迟计算)
var q = (from c in db.Customers
select c.Phone
).Concat(
from e in db.Employees
select e.HomePhone);
var q = (from c in db.Customers
select new
{
Name = c.CustomerName,
Phone = c.Phone
}).Concat(
from e in db.Employees
select new
{
Name = e.EmployeeName,
Phone = e.HomePhone
});
2、Union(合并,自动过滤相同的项。会延迟计算)
var q = (from c in db.Customers
select c.Country).Union(
from e in db.Employees
select e.Country);
3、Intersect(交。会延迟计算)
var q = (from c in db.Customers
select c.Country).Intersect(
from e in db.Employees
select e.Country);
4、Except(差,A-B。从A集合排除A交B。会延迟计算)
var q = (from c in db.Customers
select c.Country).Except(
from e in db.Employees
select e.Country);
5、Top、Bottom(取出指定数量的数据。会延迟计算)
6、Take(获取集合的前n个数据。会延迟计算)
var q = (from e in db.Employees
orderby e.HireDate
selct e).Take(5);
7、Skip(跳过集合的前n个数据。会延迟计算)
var q = (from p in db.Products
orderby p.UnitPrice descending
select p).Skip(10);
8、TakeWhile(直到某一条件不成立才停止获取。会延迟计算)
即用其条件去依次判断源序列中的元素,返回符合判断条件的元素,该判断操作将在返回false或源序列的末尾结束9、SkipWhile(顾名思义,同上)
10、Paging(分页操作)
var q = (from c in db.Customers
orderby c.CustomerName
select c).Skip(50).Take(10);
11、Like
var q = from c in db.Customers
where SqlMethods.Like(c.CustomerID, "C%")
select c;
查询消费者ID没有“AXOXT”形式的消费者:
var q = from c in db.Customers
where !SqlMethods.Like(c.CustomerID, "A_O_T")
select c;DateDiffDay
在两个时间变量之间比较。分别有:DateDiffDay、DateDiffHour、DateDiffMillisecond、DateDiffMinute、DateDiffMonth、DateDiffSecond、DateDiffYear:
var q = from o in db.Orders
where SqlMethod.DateDiffDay(o.OrderDate, o.ShippedDate) < 10
select o;
查询在创建订单后10天内发货的所有订单
12、Compiled Query(预编译查询)
NorthwindDataContext db = new NorthwindDataContext();
var fn = CompiledQuery.Compile(
(NorthwindDataContext db2, string city) =>
from c in db2.Customers
where c.City == city
select c);
var londonCusts = fn(db, "London");
var seaCusts = fn(db, "Seattle");