如何编写LINQ查询筛选出未被分配的用户名?
解决LINQ查询未分配用户名的问题
嘿,我来帮你搞定这个问题!你的需求是找出Usernames表中从未出现在Assignments表里的用户名,以你给的示例来说就是要返回user.2对吧?
我给你几种可行的LINQ写法,你可以根据自己的习惯选:
1. 查询语法写法
这种写法和SQL逻辑比较接近,可读性很好:
var unassignedUsernames = from u in Usernames where !Assignments.Any(a => a.Username == u.Username) select u.Username;
这里的!Assignments.Any(...)意思是:不存在任何一条Assignments记录的Username和当前Usernames的Username匹配,正好筛选出未被分配的用户。
2. 方法链写法
如果你更喜欢链式调用的风格,可以用这个:
var unassignedUsernames = Usernames .Where(u => !Assignments.Any(a => a.Username == u.Username)) .Select(u => u.Username);
逻辑和上面完全一样,只是写法不同。
3. 大数据量优化版
如果你的Assignments表数据比较多,建议先把已分配的用户名提取成HashSet,这样查询效率会高很多(HashSet的Contains方法比List快得多):
// 先把已分配的用户名存到HashSet里 var assignedUsernameSet = Assignments.Select(a => a.Username).ToHashSet(); // 再筛选未被分配的用户 var unassignedUsernames = Usernames .Where(u => !assignedUsernameSet.Contains(u.Username)) .Select(u => u.Username);
用你给的示例数据测试的话,这三种写法都会准确返回user.2,应该能解决你当前返回过多用户的问题啦~
内容的提问来源于stack exchange,提问作者jrn
相关产品推荐
相关产品推荐

