已经有些帖子告诉大家,如何构造Expression了. 但是那些构造Expression的方法是很麻烦的,而且没有理解好IQueryable<T>的含义. 下面是一个很简单的动态构造查询的例子: (也可以使用传统语法+Lambda:)
[align=left] exec sp_executesql N'SELECT [t0].[OrderID], [t0].[CustomerID], [t0].[EmployeeID], [t0].[OrderDate], [t0].[RequiredDate], [t0].[ShippedDate], [t0].[ShipVia], [t0].[Freight], [t0].[ShipName], [t0].[ShipAddress], [t0].[ShipCity], [t0].[ShipRegion], [t0].[ShipPostalCode], [t0].[ShipCountry] FROM [dbo].[Orders] AS [t0] LEFT OUTER JOIN [dbo].[Customers] AS [t1] ON [t1].[CustomerID] = [t0].[CustomerID] LEFT OUTER JOIN [dbo].[Shippers] AS [t2] ON [t2].[ShipperID] = [t0].[ShipVia] WHERE ([t2].[CompanyName] LIKE @p0) AND ([t1].[CompanyName] LIKE @p1)', N'@p0 nvarchar(9),@p1 nvarchar(7)', @p0 = N'%Express%', @p1 = N'%Great%' 可以看到的是, query = from order in query 了. 是的. 一个query对象, 是可以继续被查下去的. 实际上,能做 from order in nc.Orders , 正是因为 nc.Orders 是实现 IQueryable<Order> 的. 当我们使用IQueryable<T> query=from x in IQueryable<T> 的时候, 正是从一个查询,添加了新的条件或选择, 返回另外一个查询. 这些查询,一直只是构造中. 如果它的ToArray()或者其他相关方法,(例如IEnumerable.GetEnumerator), 没有被执行, 那么这个查询就不会执行.
也可以使用传统语法+Lambda:
相关信息:
昨天晚上下载了C# Express 2008 和 VWD Express 2008 , 发现没有ASP.NET3.5…?? 哦, 应该是说, 运行的还是ASP.NET2的环境, 新的语法无法在WEB中动态编译. Linq的定义,和from in where select的语法只能写在某个类库里,然后让Web去调用.
顺便用Reflector打开DLinq的实现. 发现原来还是挺简单的.
所以等我把现在的工作做完后, 我会推出 Linq To CSPAbstractRecord 的.
|