![](/img/trans.png)
[英]EF - Use multiple WHERE clause in LINQ method of IEnumerable of objects' properties
[英]Create Multiple Objects Single LINQ EF Method
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();
希望能解决您的问题!
您可以尝试创建对象数组,然后使用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将其转换为查询时会遇到问题。
如果使用查询语法而不是方法链接,则可以使用let
运算符来完成此操作。 请注意,生成的SQL可能不如本文所示完全有效,但是如果您要执行子查询,它应该可以为您工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.