条件可查询选择(MVC . net EF)

本文关键字:net EF MVC 查询 选择 条件 | 更新日期: 2023-09-27 18:18:13

我试图在加载一些数据时选择多个子节点,但我想将条件语句放在include周围。

目前,我在不同的方法中有许多不同的选择与一个特定的祖父对象一起工作,但我想把它们放在

中的一个选择中
ShapeResults(this IQueryable<SpecificObject>, bool includeParent, bool includeChildren)

方法和我所有的方法都用条件/过滤器指向它。

我在做什么,工作得很好:

var query = context.Grandparent.Select(i => new GrandparentObject
{
    GrandparentProp1 = i.GrandparentProp1 ,
    Parents = i.Parents.Select(j => new ParentObject
    {
        ParentProp1 = j.ParentProp1,
        Children = j.Children.Select(k => new ChildObject
        {
            ChildProp1 = k.ChildProp1,
        }
    }
}

我真正想做的事

var query = context.Grandparent.Select(i => new GrandparentObject
{
    GrandparentProp1 = i.GrandparentProp1,
--> if (IncludeParents)
    Parents = i.Parents.Select(j => new ParentObject
    {
        ParentProp1 = j.ParentProp1,
    --> if (IncludeParentsChildren)
        Children = j.Children.Select(k => new ChildObject
        {
            ChildProp1 = k.ChildProp1,
        }
    }
}

提前感谢!

条件可查询选择(MVC . net EF)

如何使用这样的条件运算符?

var query = context.Grandparent.Select(i => new GrandparentObject
{
    GrandparentProp1 = i.GrandparentProp1,
    Parents = includeParents
        ? i.Parents.Select(j => new ParentObject
          {
              ParentProp1 = j.ParentProp1,
              Children = includeChildren
                  ? j.Children.Select(k => new ChildObject
                    {
                         ChildProp1 = k.ChildProp1
                    }
                  : Enumerable.Empty<Child>()
          }
        : Enumerable.Empty<Parent>()
};

您也可以使用null来代替Enumerable.Empty<TResult>(),这取决于您希望返回结果的语义是什么。


编辑:刚刚意识到我完全过度思考了这需要有多复杂。试试这样:

var query = context.Grandparent.Select(i => new GrandparentObject
{
    GrandparentProp1 = i.GrandparentProp1 ,
    Parents = i.Parents
        .Where(_ => includeParents)
        .Select(j => new ParentObject
    {
        ParentProp1 = j.ParentProp1,
        Children = j.Children
            .Where(_ => includeChildren)
            .Select(k => new ChildObject
        {
            ChildProp1 = k.ChildProp1,
        }
    }
}

我一直在做类似的事情,建议这样做:

var query = context.Grandparent
                   .Select(poco => new 
                    {
                        poco     = poco,
                        parents  = poco.Parents.Where(x => includeParents)
                        children = poco.Children.Where(x => includeChildren) 
                    })
                   .Select(x => new GrandparentObject
{
    GrandparentProp1 = x.poco.GrandparentProp1,
    Parents          = x.parents.Select(parent => new ParentObject
                       {
                           ParentProp1 = parent .ParentProp1,
                           Children    = x.children.Select(child => new ChildObject
                                         {
                                             ChildProp1 = child.ChildProp1,
                                         }
                       }
}

我发现使用三元运算符是很困难的。为条件连接使用额外的选择语句似乎是最好的方法。

重要提示: .Where(x => includeChildren).Where(x => false)将产生不同的SQL查询。

如果使用变量(includeChildren), EF仍然会执行一个不返回任何结果的连接,但如果使用常量(false), EF将完全跳过连接。