Enumerable中的LINQ Enumerable-为什么
本文关键字:为什么 Enumerable- LINQ 中的 Enumerable | 更新日期: 2023-09-27 18:27:57
我有一个Ticket
类,它包含User
对象列表:
class Ticket {
public List<User> Users { get; set; }
}
我想获取所有与票证相关的用户。我这样做:
var u = from t in db.Tickets
where t.Users.Count() > 0
select t.Users
这是有效的,但返回一个具有1个元素的Enumerable
。这个元素是一个带有Users的Enumerable
。
为什么嵌套?
您需要做的是
var u = (from t in db.Tickets from user in t.Users select user).ToList();
然后你会有一个扁平的用户列表。没有必要检查where t.Users.Count() > 0
,如果确实需要,您应该使用where t.Users.Any()
来提高效率。
因为您选择了List<User>
中的IEnumerable<Users>
。。。
第二个Enumerable是您的List<User>
您可以使用以下查询将其展开。
db.Tickets.Where(t => t.Users.Any()).SelectMany(t => t.Users)
Any()
比Count() > 0
快得多,因为它会在第一次出现时停止定制,Count迭代您拥有的完整用户列表
因为它不会合并在一个列表中所有的t.用户(t0.Users,t1.Users…)。你需要将它们合并。
您可以将其合并到IEnumerable中,如下所示:数据库。Tickets。Where(t=>t.Users.Count()>0).SelectMany(t=>t.Users)
我想你正在寻找
var u = (from t in db.Tickets
from u in t.Users
select u).Distinct();
从我假设的查询中,您希望所有用户都在票证中。
你可以这样解决这个问题:
List<User> users = new List<User>();
foreach(List<user> u in db.Tickets.where(ticket => ticktet.Users.Count() > 0).select(ticket => ticket.Users)){
users.AddAll(u);
}
SelectMany方法就是您想要的。来自MSDN文档:
"将序列的每个元素投影到IEnumerable(of T),并将生成的序列展平为一个序列。"
因此,您获取所有的票证,并获取每个票证的所有用户,因此生成的列表将是一个用户列表。您可能还想使用Distinct方法来删除重复的用户。我假设一个用户可能与多个票证关联。
第一:LINQ查询将始终返回一个可枚举对象。
第二:你的t.Users是一个List,它也实现了IEnumerable。
因此,外部可枚举是linq结果集,内部可枚举是实际的第一个结果,可以投射回像这样的用户列表
var u = from t in db.Tickets
where t.Users.Count() > 0
select (t.Users as List<User)