如何对渴望获取进行排序和过滤

我如何做一个亲子关系的热切查询:

  • 过滤一个子域
  • 对父母和孩子都进行分类
  • 返回一个列表或父母与预先填充的孩子
  • 如果我尝试

    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> ie

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

    解决方案取决于你想要做什么。

    第一个查询给人的印象是你想“平坦化”对象中的结果,就像这样(伪代码,我希望这很清楚我的意思):

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

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

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

    你想要做哪两项?

    更新

    好的,看起来你想要第二个。 我不相信它可以直接完成。 枚举结果时你可以做到这一点 - 因为Parent已经被排序了,只需对每个人的子进行排序:

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

    这样做没有直接的方法,但是您可以使用某种解决方法 - 将父项和子项投影到匿名对象上,然后从对象中选择并返回父项。

    查看类似的问题:Linq To 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();
    

    预取子字段:

    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);
    }
    
    链接地址: http://www.djcxy.com/p/37647.html

    上一篇: how sort and filter on eager fetch

    下一篇: LINQ to Entities for subtracting 2 dates