2010-06-15 32 views
6

我刚开始使用EF和类似以下的查询令我奇怪:“it.Name”实体框架查询生成器方法:为什么“它”而不是lambdas?

var departmentQuery = 
       schoolContext.Departments.Include("Courses"). 
       OrderBy("it.Name"); 

具体来说,什么伸出我是当我使用LINQ to SQL进行工具化时,查询生成器查询中的每个筛选器几乎都可以用lambda指定,例如,在这种情况下,d => d.Name。

我看到有OrderBy的重写需要使用返回IOrderedQueryable或IOrderedEnumable的lambdas,但是那些显然没有获取ObjectResult所需的Execute方法可能会被数据绑定。

对于我来说,毕竟我已经阅读了关于lambda如何为这种东西做出如此重要的意义,以及如何将它们翻译成表达式树,然后转换为目标语言,这似乎很奇怪 - 为什么我需要使用“ it.Name“?

+0

另一个例子是.Where(“it.SomeProperty is not null”)。现在我已经看到了在本机C#中表现的标准查询运算符的奇怪混杂,以及完全位于TSQL-land中的显式过滤器。我认为EF的目的就是摆脱这一点。 – nlawalker 2010-06-15 22:26:01

回答

2

我得到lamdba表达式与我的;我可以做Where(it.SomeProperty == 1)...你有System.Linq作为命名空间吗?从d在schoolContext.Departments.Include( “课程”)

VAR departmentQuery =排序依据d.Name 选择d;:您可以尝试以结构调整

这些是一些可能性。

HTH。

+0

有趣。我发现你是对的,它仍然有效 - 我只需要将我的GridView的DataSource设置为departmentQuery而不是departmentQuery.Execute(MergeOptions.Whatever),因为它现在是IQueryable或IOrderedQueryable,而不是ObjectQuery,因此它没有Execute方法。既然如此,似乎我错过了设置MergeOption。我假设它只是在这种情况下使用默认值? – nlawalker 2010-06-16 00:29:05

+0

即使使用IQueryable,你也应该可以使用lambdas;只要它的通用形式,否则你需要在集合上调用Cast ()来获得它的泛型类型。这可能会使用LINQ来代替L2E对象。 FYI是IQueryable的接口,也是由ObjectQuery实现的。 – 2010-06-16 01:10:33

+0

我在说的是在Where或OrderBy之类的东西中使用lambda会返回一个IQueryable *,而不是ObjectQuery。尝试调用ObjectSet或ObjectQuery上的Where,然后查看Intellisense的重载 - 返回一个IQueryable并使用Func <>返回一个IEnumerable的结果。获得ObjectQuery的唯一方法是调用需要的重载(string,params ObjectParameter [])。所有这一切说,我现在看到你可以转换回ObjectQuery并重新获得Execute()的访问权限。标记为有用聊天的答案,thx。 – nlawalker 2010-06-16 01:18:23

相关问题