【问题标题】:Create Multiple Objects Single LINQ EF Method创建多个对象单个 LINQ EF 方法
【发布时间】:2015-06-08 19:50:34
【问题描述】:
List<MyObject> objects = await item.tables.ToAsyncEnumerable()
                               .Where(p => p.field1 == value)
                               .Select(p => new MyObject(p.field1,p.field2))
                               .ToList();

^ 我有类似的东西,但我想知道,有没有办法在同一个选择中添加第二个对象创建?例如。新的 MyObject(p.field3,p.field4) ?并将其添加到同一个列表中?顺序无所谓。

我知道可以通过多次调用数据库或将列表拆分为多个部分来做到这一点,但是有没有办法在单行中做到这一点?

【问题讨论】:

    标签: c# database linq entity-framework


    【解决方案1】:

    您可以将其创建为元组。

    List<Tuple<MyObject1, MyObject2>> = query.Select(x => Tuple.Create(
        new MyObject1
        {
            // fields
        },
        new MyObject2
        {
            //fields
        }))
        .ToList();
    

    从我在 Linqpad 的测试来看,这似乎只会命中数据库一次。

    或者,您可以从数据库中选择您知道需要的所有字段来创建两者:

    var myList = query.Select(x => new { FieldA = x.FieldA, FieldB = x.FieldB }).ToList(); //hits db once
    var object1s = myList.Select(x => new MyObject1(x.FieldA));
    var object2s = myList.Select(x => new MyObject1(x.FieldB));
    var bothLists = object1s.Concat(object2s).ToList();
    

    【讨论】:

    • 认为这将是最简单/最好的拆分方式。看着元组的方式,但认为最终会得到列表,但无论如何我都需要返工。但元组似乎是最接近的选择。因为我认为尝试做的事情是不可能的:)(可以投票吗?)
    • 任何你认为有用的东西都可以投赞成票,但你有足够的权限投赞成票。如果这回答了您的问题,请单击复选标记以表示回答。这样,如果其他人提出您的问题,他们会看到这回答了您的问题。
    【解决方案2】:

    您想要做的是在 linq 中使用 SelectMany 方法。这将从数组中选择所有项目。该数组可以匿名创建,如下所示。

    List<MyObject> objects = await item.tables.ToAsyncEnumerable()
                                   .Where(p => p.field1 == value)
                                   .SelectMany(p => new []{new MyObject(p.field1,p.field2), new MyObject(p.field3,p.field4)})
                                   .ToList();
    

    希望能解决你的问题!

    【讨论】:

      【解决方案3】:

      如果您使用查询语法而不是方法链接,则可以使用let 运算符来完成此操作。请注意,生成的 SQL 可能并不像 this article 显示的那样完全高效,但如果您正在处理子查询,它应该对您有用。

      【讨论】:

        【解决方案4】:

        您可以尝试创建一个对象数组,然后使用SelectMany 进行展平:

        List<MyObject> objects = await item.tables.ToAsyncEnumerable()
                                       .Where(p => p.field1 == value)
                                       .Select(p => new [] {
                                                    new MyObject(p.field1,p.field2),
                                                    new MyObject(p.field3,p.field4)
                                                    })
                                       .SelectMany(g => g)
                                       .ToList();
        

        但我怀疑您在让 EF 将其转换为查询时会遇到问题。

        【讨论】:

        • 如果您在内存中执行 SelectMany 可能会更好。
        • @TravisJ 可能,但我认为这不是问题 - 我不知道 EF 如何返回一个 array 对象。
        • 看起来真的很整洁,这正是我们想要做的。但是不喜欢 SelectMany 的编译器会弄得一团糟,看看它是我正在做的事情还是不可能的。谢谢
        • 试试我的编辑 - 我忘记了 SelectMany 中的投影不是可选的。
        • 用 SelectMany 尝试了一些东西。似乎唯一的方法是,从数据库中检索列表,放入变量中,然后对其执行 selectmany。没有机会测试它,或者如果 dleh,解决方案更有效。当我这样做时会回帖。 'code' List objects = queryedlist.SelectMany(p => new List { new MyObject(p.field1,p.field2), new MyObject(p.field3,p.field4) }).ToList( )
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-24
        • 2016-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多