LINQ To Enties问题

sz_free_bird 2012-04-10 05:10:47
using (NorthwindEntities context = new NorthwindEntities())
{
Expression<Func<NorthwindEFDemo.Product, bool>> expr = p =>
(String.IsNullOrEmpty(textBox1.Text) ? true : p.ProductName.Contains(textBox1.Text));
var data = context.Products.Where(expr.Compile()).Select(p => new
{
PorudctName= p.ProductName,
CategoryName=p.Category.CategoryName
});
dataGridView1.DataSource = data.ToList();
}

上面的代码使用Northwind的示例数据库。目的是想实现一个动态查询。功能基本没问题。但有疑问。就是生成SQL脚本的问题。加入在textBox1中输入的:ab。下面贴上生成的脚本
SELECT 
[Extent1].[ProductID] AS [ProductID],
[Extent1].[ProductName] AS [ProductName],
[Extent1].[SupplierID] AS [SupplierID],
[Extent1].[CategoryID] AS [CategoryID],
[Extent1].[QuantityPerUnit] AS [QuantityPerUnit],
[Extent1].[UnitPrice] AS [UnitPrice],
[Extent1].[UnitsInStock] AS [UnitsInStock],
[Extent1].[UnitsOnOrder] AS [UnitsOnOrder],
[Extent1].[ReorderLevel] AS [ReorderLevel],
[Extent1].[Discontinued] AS [Discontinued]
FROM [dbo].[Products] AS [Extent1]

exec sp_executesql N'SELECT 
[Extent1].[CategoryID] AS [CategoryID],
[Extent1].[CategoryName] AS [CategoryName],
[Extent1].[Description] AS [Description],
[Extent1].[Picture] AS [Picture]
FROM [dbo].[Categories] AS [Extent1]
WHERE [Extent1].[CategoryID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=4

我的疑问在,为什么在Product的过滤语句中没有where子句的生成。
如果我换一种写法,不使用表达式树。代码如下
 using (NorthwindEntities context = new NorthwindEntities())
{
//Expression<Func<NorthwindEFDemo.Product, bool>> expr = p =>
// (String.IsNullOrEmpty(textBox1.Text) ? true : p.ProductName.Contains(textBox1.Text));
var data = context.Products.Where(p=>p.ProductName.Contains(textBox1.Text)).Select(p => new
{
PorudctName= p.ProductName,
CategoryName=p.Category.CategoryName
});
dataGridView1.DataSource = data.ToList();
}

生成的SQL语句如下:
exec sp_executesql N'SELECT 
1 AS [C1],
[Extent1].[ProductName] AS [ProductName],
[Extent2].[CategoryName] AS [CategoryName]
FROM [dbo].[Products] AS [Extent1]
LEFT OUTER JOIN [dbo].[Categories] AS [Extent2] ON [Extent1].[CategoryID] = [Extent2].[CategoryID]
WHERE [Extent1].[ProductName] LIKE @p__linq__0 ESCAPE N''~''',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'%ab%'


我想知道为什么这两种写法导致生成的SQL语句会有这么大的差别。而且第一种方式,根据生成的SQL来看,是整张表的数据都加载了,如果数据量大的话,性能是个很大的问题。
...全文
121 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sz_free_bird 2012-04-10
  • 打赏
  • 举报
回复
为什么这么说呢?
边城的刀声 2012-04-10
  • 打赏
  • 举报
回复
貌似是expr.Compile()的问题
Compile的问题

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧