【问题标题】:LINQ Grouping helpLINQ 分组帮助
【发布时间】:2010-10-09 02:09:35
【问题描述】:

我有一个包含父子记录的数据库表,非常类似于类别表。该表的 ParentID 字段保存了该记录的父记录的 ID...

我的表格列是:SectionID、Title、Number、ParentID、Active

我只打算让我的父母与孩子的关系深入两个层次。所以我有一个部分和一个子部分和它。

我需要以这样的大纲方式将此数据输出到我的 MVC 视图页面中......

  1. 第 1 节
    • 1 的第 1 小节
    • 1 的第 2 小节
    • 1 的第 3 小节
  2. 第 2 节
    • 第 1 小节,共 2 节
    • 第 2 小节,共 2 节
    • 第 3 小节,共 2 节
  3. 第 3 节

我正在使用 Entity Framework 4.0 和 MVC 2.0 并且从未尝试过使用 LINQ 进行类似的操作。我在节表上设置了一个 FK,将 ParentID 映射回 SectionID,希望 EF 会创建一个复杂的“节”类型,其中子节作为节类型列表的属性,但也许我没有正确设置。

所以我猜我仍然可以使用 LINQ 查询获得最终结果。有人可以指出一些可以提供解决方案或可能提供正确方向提示的示例代码吗?

更新:

我能够整理我的 EDMX,以便我可以将每个部分的子部分作为类型列表的属性,但现在我意识到我需要对相关实体进行排序。

var sections = from section in dataContext.Sections
                       where section.Active == true && section.ParentID == 0
                       orderby section.Number
                       select new Section
                       { 
                        SectionID = section.SectionID,
                        Title = section.Title,
                        Number = section.Number,
                        ParentID = section.ParentID,
                        Timestamp = section.Timestamp,
                        Active = section.Active,
                        Children = section.Children.OrderBy(c => c.Number)
                       };

产生以下错误。 无法将类型“System.Linq.IOrderedEnumerable”隐式转换为“System.Data.Objects.DataClasses.EntityCollection”

【问题讨论】:

  • 花一些时间清理您的问题的格式。读起来很痛苦。可以粘贴 EDMX 设计器的屏幕截图,这样我们就可以将关系可视化。
  • 抱歉,我修好了,我把列表卡在一个代码块中,以为编辑器会保留返回和空格。
  • 我想我将不得不切换到 WebForms、ADO.Net 和类型化数据集。对于转向 .net 的开发人员来说,LINQ 是一个巨大的障碍。很遗憾,除了简单的选择表达式之外的任何东西都不是很直观且难以掌握。我在其他 3 个网站上发布了同样的问题,但没有一个网站有任何 cmets。我猜大多数 .net 开发人员不知道如何使用 linq 对数据输出进行分组。除了一堆示例代码之外,我还没有找到一个解释 linq 分组实际机制的教程。
  • I have a FK set up on the section table mapping the ParentID back to the SectionID hoping EF would create a complex "Section" type with the Sub-Sections as a property of type list of Sections but maybe I did not set things up correctly. 你的假设是正确的。如果你有一个 FK,你的实体应该有一个 Section 类型的 Parent 属性和一个“小节”的集合。如果不是这样,您能否扩展您的答案并发布生成的类型(可能是 EDMX 屏幕截图)?

标签: linq


【解决方案1】:

您的模型有两个导航属性Sections1Section1。将第一个重命名为Children,将第二个重命名为Parent

根据您是否有一个根 Section 或者是否每个顶级 Section 都作为其自身的父级(或者改为使父级可为空?),您的查询可能类似于:-

  // assume top sections are ones where parent == self
  var topSections = context.Sections.Where(section => section.ParentId == SectionId);

  // now put them in order (might have multiple orderings depending on input, pick one)
  topSections = topSections.OrderBy(section => section.Title);

  // now get the children in order using an anonymous type for the projection
  var result = topSections.Select(section => new {top = section, children = section.Children.OrderBy(child => child.Title)});

【讨论】:

  • 谢谢,这是有道理的。重命名它们......我希望我根本不需要进行任何分组。如果我得到我所有的父部分,它们应该每个都有一个列表属性,其中包含所有子项的列表是否正确?有了这个,我应该能够摆脱每个循环的嵌套。
  • @JBeckton - 没错。我想主要问题是识别您的Section 实体的正确属性。对于以前没有使用过 EF 的人来说,这可能会很棘手,因为默认命名不是特别具有描述性。
  • 好的,我能够利用复杂类型功能和嵌套的每个循环来输出每个部分及其子部分,现在我意识到我还有另一个问题。我需要能够按某个属性订购子部分!我的部分和子部分是可排序的,我有一个名为 number 的数据库字段,用于管理排序顺序。我想我又回到了使用 linq,所以我可以分组和排序?
  • 我找到了一种对blogs.msdn.com/b/alexj/archive/2009/02/25/… 关系进行排序的方法,但我认为这不适用于我的情况,因为我基本上是自己加入表格以获取子部分作为孩子。也许我需要调整我的 EDMX,以便 EF 认为我的子部分来自不同的表?无法将类型“System.Linq.IOrderedEnumerable”隐式转换为“System.Data.Objects.DataClasses.EntityCollection
  • @Hightechrider:我正在使用 MVC2,如何在我的视图中使用匿名类型?我尝试创建一个匹配的类,这样我就可以强制转换 anon 类型,但我无法正确选择我的类型。
【解决方案2】:

对于一些 linq 示例:

http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

这几乎涵盖了所有的 linq 操作,尤其是 GroupBy。关键是要了解每件作品的输入和输出,以便将多个作品串联起来,没有捷径可走,只能了解它们的作用,这样你就知道手头有什么。 Linq 表达式只是这些操作与一些语法糖的组合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-20
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多