Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ to实体选择父对象时对子对象进行排序_C#_Linq_Linq To Entities - Fatal编程技术网

C# 使用LINQ to实体选择父对象时对子对象进行排序

C# 使用LINQ to实体选择父对象时对子对象进行排序,c#,linq,linq-to-entities,C#,Linq,Linq To Entities,假设您有一些实体框架实体看起来像这样(显然不是这些特定的类,而是带有所有实体框架管道的自动生成的类;这些只是为了说明): 但是,这将返回子项按ID顺序排列的父项列表。我希望子对象在其父对象中按其Number属性进行排序。 如何做到这一点 Edit:一个澄清:其想法是将查询隐藏在一个方法调用后面(在层外观中),该方法调用只返回一个IList。这使得使用诸如匿名类查询和手动排序之类的解决方案变得很痛苦(与一些灵丹妙药解决方案相比,您只需在查询或其他方面进行操作即可)。看看这一点。您可以尝试以下方法:

假设您有一些实体框架实体看起来像这样(显然不是这些特定的类,而是带有所有实体框架管道的自动生成的类;这些只是为了说明):

但是,这将返回子项按ID顺序排列的父项列表。我希望子对象在其父对象中按其Number属性进行排序。 如何做到这一点

Edit:一个澄清:其想法是将查询隐藏在一个方法调用后面(在层外观中),该方法调用只返回一个
IList
。这使得使用诸如匿名类查询和手动排序之类的解决方案变得很痛苦(与一些灵丹妙药解决方案相比,您只需在查询或其他方面进行操作即可)。

看看这一点。您可以尝试以下方法:

from parent in context.Parents.Include("Child")
select parent
var query = ((from parent in context.Parents
              from child in parent.Child
              orderby child.Number ascending
              select parent) as ObjectQuery<Parent>
            ).Include("Child");
var query=((来自context.Parents中的父项)
从父项中的子项。子项
orderby子项。数字升序
选择“父对象”(parent)作为ObjectQuery
)。包括(“儿童”);

一个选项是在内存中执行查询和排序(例如在输出时)

另外两种选择似乎也各有利弊:


以下是我所做的一些事情:

var query = from parent in context.Parents 
            select new 
            {
                 parent,
                 childs = from child in context.Child
                            orderby child.ID ascending
                            select new
                            {
                                 child
                            }
            }

我实现了类似的东西,对我来说效果很好

Alex James在中讨论了这个问题


本质上,根据标准关系建模,关系被认为是无序的。所以你不能把它们分类。但是你可以投射到其他集合,这些集合可以排序。

对不起,达林,我已经尝试了你的例子,但它不起作用。两个from语句导致父级和子级之间的联接,并导致每个返回的子级有一个父级。因此,您将返回每个父项多次出现,并且每个父项包含其所有(仍然未排序)子项!看看另一个提示:@Craig Stuntz:Craig,你的链接实际上似乎是这个问题的答案(或者没有答案,真的!),直接来自微软的伙计们。你应该把它作为答案提交,我会接受的。谢谢你的建议,但是,我不想使用匿名类。我的数据库代码隐藏在自己的层中,因此我有一个返回IList的方法调用。要实现这一点,使用匿名类很麻烦,因为我必须手动重建对象树(手动将子对象放入父对象,然后返回父对象)。这违背了让实体框架和LINQ为我管理关系和对象图创建的目的。谢谢你的建议!然而,我认为您的第一个有点笨拙,因为它需要您手动订购东西,这与使用LINQ查询让DB完成这项工作(以及增加的整洁度)的目的背道而驰。第一个链接被接受的解决方案实际上不起作用(我对此发表了评论,请看一看)。第二个链接似乎是关于按孩子对父母进行排序,然后选择孩子,这不是我要找的。我正在寻找一种灵丹妙药,从你的答案和其他答案判断,实体框架根本不存在,我认为你是对的。。。至少不在3.5附带的版本中。还不了解4.0…另外,您不能无序地阅读它们,将它们从EntityCollection中取出,手动对它们进行排序,然后将它们放回EntityCollection中(当然,假设NoTracking处于启用状态)。然后,当您迭代EntityCollection时,它们仍然会出现问题:(右,因为
EntityCollection
s是无序的。
var parents = context.Parents.Include("Child").ToList(); //note that ToList is here just to execute the query and get the objects in memory

foreach (var p in parents)
{
   //do something with parent item
   foreach (var c in p.Child.OrderBy(c => c.Number))
   {
      /do something with the child item
   }
}
var query = from parent in context.Parents 
            select new 
            {
                 parent,
                 childs = from child in context.Child
                            orderby child.ID ascending
                            select new
                            {
                                 child
                            }
            }