LINQ可枚举的数字 - 为什么?

时间:2012-03-16 12:15:55

标签: c# linq enumerable

我有一个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。该元素是用户的Enumerable

为什么要嵌套?

8 个答案:

答案 0 :(得分:4)

您需要做的是

  var u = (from t in db.Tickets from user in t.Users select user).ToList();

然后你将有一个扁平的用户列表。 无需检查where t.Users.Count() > 0,如果您确实需要,则应使用t.Users.Any()以提高效率。

答案 1 :(得分:4)

因为您选择IEnumerable<Users> List<User> ...

第二个可枚举是你的List<User>

您可以使用以下查询来展平它。

db.Tickets.Where(t => t.Users.Any()).SelectMany(t => t.Users)

Any()Count() > 0快得多,因为它会在第一次出现时停止宣传,迭代您拥有的完整用户列表

答案 2 :(得分:1)

因为它没有在一个列表中合并所有t.Users(t0.Users,t1.Users ...)。你需要把它们结合起来。

答案 3 :(得分:1)

你可以像这样将它合并到IEnumerable:     db.Tickets.Where(t =&gt; t.Users.Count()&gt; 0).SelectMany(t =&gt; t.Users)

答案 4 :(得分:1)

我认为你在寻找

var u = (from t in db.Tickets
         from u in t.Users
         select u).Distinct();

答案 5 :(得分:0)

从查询中我想你想让门票中有所有用户。

您可以这样解决:

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

答案 6 :(得分:0)

SelectMany方法就是您想要的。从MSDN文档:

“将序列的每个元素投影到IEnumerable(Of T)并将生成的序列展平为一个序列。”

因此,您获取所有票证并获取每张票证的所有用户,以便生成的列表将是用户列表。您也可能希望使用Distinct方法删除重复的用户。我假设用户可能与多张票证相关联。

答案 7 :(得分:-1)

首先:LINQ-Query将始终返回一个可枚举的。

第二:你的t.Users是一个List,它实现了IEnumerable。

所以外部可枚举是linq结果集,内部实例是可以强制转换回用户列表的实际第一个结果,如

var u = from t in db.Tickets
       where t.Users.Count() > 0
       select (t.Users as List<User)