2011-03-16 59 views
1

我怎么做的父子关系的渴望查询:LINQ查询 - 排序和过滤的渴望如何获取

  1. 过滤器儿童领域
  2. 各种各样双方父母和孩子
  3. 返回列表或父母与孩子预填充

如果我尝试

from p in _context.Parents.Include("children") 
join c in _context.childrenon p.Id equals c.ParentId 
where d.DeletedDate == null 
orderby p.Name ascending, c.Name 
select p 

然后我得到的父对象回来,但每个家长都有NULL儿童

,如果我尝试

from p in _context.Parents.Include("children") 
orderby p.Name ascending 
select p 

查询返回所有的父母和孩子,但他们不过滤或排序。

,我想回去的结果是IEnumerable<Parent>

Parent[0].name = "foo" 
Parent[0].children = IEnumerable<Child> 
Parent[1].name = "bar" 
Parent[1].children = IEnumerable<Child> 
+0

我想每个家长可能为零或更多的孩子。父母有多个孩子时,预期的产出是多少? – tvanfosson 2011-03-16 12:12:38

+0

@tvanfosson我已更新我的问题与此信息 – Daveo 2011-03-16 12:18:06

回答

1

的解决方案取决于正是你正在尝试做的。

第一个查询让你想“变平”的结果中的对象的印象,这样的(伪代码,我希望这是清楚明白我的意思):

{ Parent1, Child1 } 
{ Parent1, Child2 } 
{ Parent1, Child3 } 
{ Parent2, Child1 } 

在这种情况下,每个结果“行“将是具有ParentChild属性的对象,您可以按父级名称,然后按子级名称进行排序。

第二个查询只是返回Parent对象和(您不显示它,但我假设EF已被指示要这样做),每个对象都有一个Children集合。在这种情况下,您只能按父母名称排序;如果您想对每个Parent的孩子进行排序,请单独对该对象上的Children集合进行排序。

你想要做哪两项?

更新

OK,看来你想要第二个。我不相信它可以直接完成。你可以做它时,你列举的结果 - 因为Parent s的已经排序,只是每个人的儿童进行排序:

var sortedChildren = parent.Children.OrderBy(c => c.Name); 
+0

我宁愿第二个选项。我的最终目标是与optGroup标记分组的选择框 – Daveo 2011-03-16 12:21:54

+0

如果我错了,请纠正我,但您是否建议从数据库中提取父项,然后在内存中进行排序? – Yakimych 2011-03-16 12:36:40

+0

我得到它与选择所有数据,然后在内存中排序工作。是的,这可能不是最有效的,但我的数据集只是很小,它很容易编码p.Chilren.Where(x => x.DeletedDate == null).OrderBy(x => x.Name);在每个父母的循环中 – Daveo 2011-03-16 12:45:06

8

有这样做的没有直接的方法,但你可以用一种变通方法某种程度上是 - 将父项和子项投影到一个匿名对象上,然后从对象中选择并返回父项。

见类似的问题:Linq To Entities - how to filter on child entities

你的情况,你将不得不沿着线的东西:

var resultObjectList = _context. 
         Parents. 
         Where(p => p.DeletedDate == null). 
         OrderBy(p => p.Name). 
         Select(p => new 
           { 
            ParentItem = p, 
            ChildItems = p.Children.OrderBy(c => c.Name) 
           }).ToList(); 

List<Parent> resultingCollection = resultObjectList.Select(o => o.ParentItem).ToList(); 
+2

我现在正在尝试这种方式,当它产生正确的SQL但结果集合没有填充子项目。无论如何,CAST从匿名类型返回到带有子列表的父对象?或者我应该只是创建一个与匿名类型(我使用mvc .net)匹配的新View模型 – Daveo 2011-03-18 06:48:06

0

预取子领域:

using (BlogDataContext context = new BlogDataContext()) 
{ 
    DataLoadOptions options = new DataLoadOptions(); 
    options.LoadWith<Blog>(c => c.Categories); 
    options.LoadWith<Blog>(c => c.Title); 
    context.LoadOptions = options; 
    Blog blog = context.Blogs.Single<Blog>(c => c.BlogId == 1); 
} 
+0

我认为LoadOptions仅适用于DataContext,而不适用于Entity.DbContext – Daveo 2011-03-16 12:42:44