【问题标题】:Entity Framework Ordering Navigate Objects实体框架排序导航对象
【发布时间】:2012-02-23 10:31:58
【问题描述】:

我有如下查询

 return this.Context.Modules
               .Select(p => new
               {
                   Module = p,
                   Page = p.Pages.OrderBy(c => c.AuthOrder)

               }).ToList()
               .Select(a => a.Module)
               .ToList();

但我使用的是 EF 4.2,我尝试像这样并通过 SQL Profiler 观察,EF 生成更多嵌套的 sql 查询,我只想像这样对这项工作进行一个查询

select * from Modules m join Pages p on m.ID = p.Module_ID
order by p.AuthOrder

这怎么可能?

【问题讨论】:

  • ToList() 操作是否需要两次?
  • 是的?我如何订购导航?

标签: c# .net linq entity-framework entity-framework-4


【解决方案1】:

这样查询

select * from Modules m join Pages p on m.ID = p.Module_ID
order by p.AuthOrder

可以通过下一个方式实现:

var q = (from c in Context.Modules
            join o in Context.Pages on c.ID equals o.Module_ID
            orderby o.AuthOrder
            select new {c, o}).ToList();

【讨论】:

  • 这种类型的返回类型是什么?我的方法是 List 但它没有转换。
  • 返回类型是匿名类型。你想得到什么,只有模块?在上面的查询中,将“new {c, o}”替换为“c”。
【解决方案2】:

您可能正在寻找Include(),它指定要包含在结果中的相关对象(即必须在您的 SQL 请求中加入哪些表):

return this.Context.Modules.Include("Pages")
               .Select(p => new
               {
                   Module = p,
                   Page = p.Pages.OrderBy(c => c.AuthOrder)

               }).ToList()
               .Select(a => a.Module)
               .ToList();

编辑: 你确定你的查询有意义吗?你实际上只选择Module,那你为什么要先点Pages

【讨论】:

  • @tobias 但是你最终只选择了模块而不是页面,你为什么要订购页面?
  • 因为它在表中有一个订单(序列)字段:),实际上它是一个站点菜单模型,一个模块有很多页面,页面必须在该菜单的每个模块下排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
相关资源
最近更新 更多