转换LINQ到SQL表达式表达式树
问题描述:
谁能这种简单的LINQ到SQL转换为表达式树:转换LINQ到SQL表达式表达式树
List<Region> lst = (from r in dc.Regions
where r.RegionID > 2 && r.RegionDescription.Contains("ern")
select r).ToList();
答
这应做到:
var query = dc.Regions.AsQueryable();
ParameterExpression pe = Expression.Parameter(typeof(Region), "region");
Expression id = Expression.PropertyOrField(pe, "RegionID");
Expression two = Expression.Constant(2);
Expression e1 = Expression.GreaterThan(id, two);
Expression description = Expression.PropertyOrField(pe, "RegionDescription");
MethodInfo method = typeof(string).GetMethod("Contains", new[] {typeof(string)});
Expression ern = Expression.Constant("ern",typeof(string));
Expression e2 = Expression.Call(description, method, ern);
Expression e3 = Expression.And(e1, e2);
MethodCallExpression whereCallExpression = Expression.Call(
typeof(Queryable),
"Where",
new Type[] { query.ElementType },
query.Expression,
Expression.Lambda<Func<Region, bool>>(e3, new ParameterExpression[] { pe }));
var results = query.Provider.CreateQuery<Region>(whereCallExpression);
List<Region> lst = results.ToList();
而且只选择RegionID
从结果集执行以下操作:
MethodCallExpression selectExpression = Expression.Call(
typeof(Queryable),
"Select",
new[]{ typeof(Region), typeof(int)},
whereCallExpression,
Expression.Lambda<Func<Region, int>>(id, pe));
var regionIDsQuery = query.Provider.CreateQuery<int>(selectExpression);
List<int> regionIDs = regionIDsQuery.ToList();
非常感谢。可以介绍一些关于Expression Tree的文章吗?你是表达树的主人吗?谢谢 – Arian 2011-03-08 04:51:48
请编辑你的文章,并用“ern”替换“widget”。你可以告诉我,如果我只想选择“RegionID”,我该怎么做。谢谢 – Arian 2011-03-08 05:26:54
@Nima很高兴我能帮忙。谢谢你这么说,但我不是'Expression Trees'的主人。它们只是一个有趣的结构,我一般都会更好地理解'Linq'。我建议阅读课程的文档,但也要编写一些标准的'Linq'查询,然后检查它们的'Expression'属性。一点一点地这将帮助你了解潜在的机制。我会更新我的答案以包含“选择”呼叫。 – Sorax 2011-03-08 15:21:52