创建多个对象单一LINQ EF方法


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) ?把它加到同一个列表里?顺序不重要。

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

您可以将其创建为元组。

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();

你要做的是使用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();

希望这能解决你的问题!

如果您使用查询语法而不是方法链接,则可以使用let操作符来完成此操作。请注意,生成的SQL可能不像本文所展示的那样具有完全的性能,但如果您要查询子查询,它应该可以为您工作。

您可以尝试创建一个对象数组,然后使用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翻译成查询

相关内容

  • 没有找到相关文章

最新更新