asp.net - 具有 .Any 条件的 Linq 查询返回 nullreference 异常

标签 asp.net linq asp.net-mvc-2 iqueryable

我有以下函数,它根据 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/

相关文章:

c# - 为 ASP.Net MVC 2 创建 RESTful 按钮

c# - Parallel.Foreach 中的 Ninject 异常

.net - 将 sqldatasource 绑定(bind)到 asp :label in asp.net 4.0 的正确方法是什么?

c# - 传递实体,从 View 到 Controller

c# - 在 asp.net 中删除行

c# - 如何使用 LINQ 解析此 XML?

c# - 在 LINQ 的 Entity Framework 中传入实体的属性

c# - 如何将整个行传输到 linq 中的模型中,而不将每个属性的名称放入 {}

c# - 单元测试元数据类型

c# - Mono asp.net MVC2 路由在 windows .net-4.0 中工作但在 mono-2.8 中不工作