我有以下函数,它根据 LINQ 表达式从数据库返回结果:
IQueryable<TEntity> FindAll<TEntity>(Expression<Func<TEntity, bool>> expression)
当我尝试在使用.Any
时从函数中提取数据时从列表中的函数我得到一个空引用异常。
但是,当我在没有特定条件的情况下提取数据并使用相同的 .Any
时foreach 循环中的函数一切正常。
这是尝试使用 .Any
的调用不起作用的功能:
var ppcReports = repository.FindAll<PPCReport>(
x => x.ClientId == clientId &&
(campaigns.Any(c=> c.Id == x.CampaignId))
).ToList();
以及它正常工作的方式:
var ppcReports = repository.FindAll<PPCReport>(
x => x.ClientId == clientId).ToList();
foreach (var item in ppcReports)
{
if (campaigns.Any(c => c.Id == item.CampaignId))
{
// do something
}
}
我想知道为什么会发生这种情况,我做错了什么吗?在查询完成之前不可能过滤结果吗?
调用.ToList()
在过滤结果之前它确实有效,所以我想我不能对 IQueryable<T>
执行这样的操作实现?
var ppcReports = repository.
FindAll<PPCReport>(x => x.ClientId == clientId).
ToList().
Where(w => campaigns.Any(c => c.Id == w.CampaignId)).
ToList();
最佳答案
就像那些发表评论的人一样,我很惊讶您收到了 NullReferenceException,而不是提示无法将该语句编译为 SQL。但是,以下代码应该让您在 1 个查询中完成此操作(并将在 SQL 中执行所有过滤):
var campaignIds = (campaigns ?? Enumerable.Empty<Campaign>())
.Select(c => c.Id);
var ppcReports = repository
.FindAll<PPCReport>(pr => pr.ClientId == clientId
&& campaignIds.Contains(pr.CampaignId))
.ToList();
这应该适用于 EF 和 Linq-to-SQL。
关于asp.net - 具有 .Any 条件的 Linq 查询返回 nullreference 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11740841/