博客园已经有些帖子告诉大家,如何构造Expression了.
但是那些构造Expression的方法是很麻烦的,而且没有理解好IQueryable<T>的含义.
下面是一个很简单的动态构造查询的例子:
(也可以使用传统语法+Lambda:)
string customername="Great";
string shippername="Express";
using (NorthwindContext nc = new NorthwindContext())
{
var query = from order in nc.Orders select order;
if (!string.IsNullOrEmpty(customername))
{
query = from order in query where order.Customer.CompanyName.Contains(customername) select order;
}
if (!string.IsNullOrEmpty(shippername))
{
query = from order in query where order.Shipper.CompanyName.Contains(shippername) select order;
}
Console.WriteLine(query.ToArray().Count());
}
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:
if (!string.IsNullOrEmpty(customername))
{
//query = from order in query where order.Customer.CompanyName.Contains(customername) select order;
query = query.Where(order => order.Customer.CompanyName.Contains(customername));
}
if (!string.IsNullOrEmpty(shippername))
{
//query = from order in query where order.Shipper.CompanyName.Contains(shippername) select order;
query = query.Where(order => order.Shipper.CompanyName.Contains(shippername));
}
相关信息:
昨天晚上下载了C# Express 2008 和 VWD Express 2008 , 发现没有ASP.NET3.5…??
哦, 应该是说, 运行的还是ASP.NET2的环境, 新的语法无法在WEB中动态编译.
Linq的定义,和from in where select的语法只能写在某个类库里,然后让Web去调用.
顺便用Reflector打开DLinq的实现. 发现原来还是挺简单的.
所以等我把现在的工作做完后, 我会推出 Linq To CSPAbstractRecord 的.
(不知道CSPAbstractRecord是什么,可以看看我这里的主页..)