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

为什么嵌套?

Enumerable中的LINQ 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)