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翻译成查询