我有以下LINQ查询从2个集合中提取最终结果集:usersAd
和usersWithSecurity
:
var results = from usrAd in usersAd
from usrRepo in usersWithSecurity
.Where(x => usrAd.Value.ToLower() == x.Value.ToLower())
.DefaultIfEmpty()
select new User(userRepository)
{
ID = usrRepo == null ? null : usrRepo.ID,
Value = usrAd.Value,
FullName = usrAd.FullName
};
问题是我一直收到以下错误:Value cannot be null.
我知道问题是usersWithSecurity
集合是空的。我在结尾处添加了'.DefaultIfEmpty()`但它仍然会产生异常。
我如何修改我的LINQ语句以继续并从usersAd
返回所有和来自usersWithSecurity
的项目(如果存在且值匹配)(如lambda中所示) )?
答案 0 :(得分:2)
var usersWithSecurity = _biz.getUsersWithSecurity() ?? new List<User>();
var results = from usrAd in usersAd
from usrRepo in usersWithSecurity
where usrAd.Value.ToLower() == usrRepo.Value.ToLower()
select new User(userRepository)
{
ID = usrRepo == null ? null : usrRepo.ID,
Value = usrAd.Value,
FullName = usrAd.FullName
};
答案 1 :(得分:2)
我认为Value cannot be null
是来自ArgumentNullException
的标准邮件。如果您正在调试,并且展开了错误消息,您将看到导致参数null异常的实际参数名称。
usersAd
,usersWithSecurity
,userRepository
是否为空?
编辑:
好的,在您的评论中提供了更多信息,我现在看到了这个问题。 usersWithSecurity
为空,但不可以。 source
参数是IEnumerable
和IQueryable
类中找到的所有扩展方法中的来源Enumerable
或Queryable
的名称。
如果你解决了这个问题,那么它应该按照你的预期工作,离开加入和所有。
usersWithSecurity = usersWithSecurity ?? Enumerable.Empty<User>(); // or similar
答案 2 :(得分:1)
当您在空变量上执行.ToLower()
时,肯定会出现您的问题。我建议避免在循环中隐藏字符串分配(在您的情况下,在Where
内)。相反,请使用String.Compare()
。
以下是使用您的代码的示例。
var results = from usrAd in usersAd
from usrRepo in usersWithSecurity.Where(x => string.Equals(usrAd.Value, x.Value, StringComparison.OrdinalIgnoreCase))
select new User(userRepository)
{
ID = usrRepo == null ? null : usrRepo.ID,
Value = usrAd.Value,
FullName = usrAd.FullName
};