Linq to entities 表达式树方式查询

sz_free_bird 2013-07-31 07:24:53

static void Main(string[] args)
{
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
//表达式树方式查询
ParameterExpression parameter = Expression.Parameter(typeof(Address), "p");
MemberInfo memberInfo = typeof(Address).GetMember("AddressID").Single();
MemberExpression memberExpression = Expression.MakeMemberAccess(parameter, memberInfo);
BinaryExpression binaryExpression = Expression.Equal(memberExpression, Expression.Constant(22));
Expression<Func<Address, bool>> expr = Expression.Lambda<Func<Address, bool>>(binaryExpression, new ParameterExpression[] { parameter });
var query1 = context.Addresses.Where(expr.Compile());
foreach (var q in query1)
{
Console.WriteLine(q.AddressID+"\t"+q.AddressLine1);
}

//原生方式查询
var query2 = context.Addresses.Where(p => p.AddressID == 22);
foreach (var q in query2)
{
Console.WriteLine(q.AddressID + "\t" + q.AddressLine1);
}
}
System.Console.ReadKey();
}

大家好:
第一种是构造表达式树的方式查询,第二种是直接使用lamda 表达式查询,两种方式都查询出想要的数据(AddressID 为22的行)。问题如下
第一种方式生成的SQL语句是:

SELECT
[Extent1].[AddressID] AS [AddressID],
[Extent1].[AddressLine1] AS [AddressLine1],
[Extent1].[AddressLine2] AS [AddressLine2],
[Extent1].[City] AS [City],
[Extent1].[StateProvinceID] AS [StateProvinceID],
[Extent1].[PostalCode] AS [PostalCode],
[Extent1].[rowguid] AS [rowguid],
[Extent1].[ModifiedDate] AS [ModifiedDate]
FROM [Person].[Address] AS [Extent1]

第二种方式生成的SQL语句是:

SELECT
[Extent1].[AddressID] AS [AddressID],
[Extent1].[AddressLine1] AS [AddressLine1],
[Extent1].[AddressLine2] AS [AddressLine2],
[Extent1].[City] AS [City],
[Extent1].[StateProvinceID] AS [StateProvinceID],
[Extent1].[PostalCode] AS [PostalCode],
[Extent1].[rowguid] AS [rowguid],
[Extent1].[ModifiedDate] AS [ModifiedDate]
FROM [Person].[Address] AS [Extent1]
WHERE 22 = [Extent1].[AddressID]

好像第一种方式是加载所有数据,然后在内存中过滤AddressID为22的行,我担心的是如果是上百万行数据也按照这种方式去查询,那问题就很严重了。
我想请教各位,是我的表达式树构造有问题还是其他什么原因造成这种结果。谢谢!
数据库采用的是AdventureWorks示例数据库,哪位热心的朋友也可以测试看看问题。
...全文
229 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sz_free_bird 2013-08-01
  • 打赏
  • 举报
回复
明白了,这个编译,应该由provider来做,我不应该多此一举!谢谢!结贴。
devmiao 2013-08-01
  • 打赏
  • 举报
回复
编译成委托后,就不能在数据库那里查询了,只能全部取出来,在本地内存中过滤,要使用数据库端的查询、过滤,必须传Expression<Func<>>
sz_free_bird 2013-08-01
  • 打赏
  • 举报
回复
引用 1 楼 devmiao 的回复:
expr.Compile() => expr

var query1 = context.Addresses.Where(expr);
这样用生成的SQL语句和第二种一模一样,能给我讲讲原因么?
sz_free_bird 2013-08-01
  • 打赏
  • 举报
回复
这是什么意思?
devmiao 2013-07-31
  • 打赏
  • 举报
回复
expr.Compile() => expr

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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