2

我试图在加载一些数据时选择多个孩子,但我想在包含周围放置条件语句。

目前,我在不同的方法中使用 1 个特定的祖父母对象有许多不同的选择,但我想将它们放入一个选择中

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,
        }
    }
}

提前致谢!

4

2 回答 2

1

像这样使用条件运算符怎么样?

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,
        }
    }
}
于 2013-06-13T23:40:01.967 回答
0

亚当,我一直在研究类似的东西,并会推荐这样的东西:

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) vs.Where(x => false)会产生不同的 SQL 查询。

如果使用变量 (),EF 仍将执行不返回任何内容的连接includeChildren,但如果使用常量 (),则将完全跳过连接false

于 2014-06-13T18:50:58.333 回答