我有一个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
。
为什么要嵌套?
答案 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)