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

Asp.net 具有.Any条件的Linq查询返回nullreference异常,asp.net,linq,asp.net-mvc-2,iqueryable,Asp.net,Linq,Asp.net Mvc 2,Iqueryable,我有以下函数,它根据LINQ表达式从数据库返回结果: IQueryable<TEntity> FindAll<TEntity>(Expression<Func<TEntity, bool>> expression) 以及它正常工作的方式: var ppcReports = repository.FindAll<PPCReport>( x => x.ClientId == clientId).ToList(); fore

我有以下函数,它根据LINQ表达式从数据库返回结果:

IQueryable<TEntity> FindAll<TEntity>(Expression<Func<TEntity, bool>> expression)
以及它正常工作的方式:

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
    }
}

像那些发表评论的人一样,我很惊讶您得到的是一个NullReferenceException,而不是关于无法将该语句编译为SQL的抱怨。但是,以下代码应允许您在1个查询中执行此操作(并将在SQL中执行所有筛选):

var-activitids=(活动??可枚举的.Empty())
.选择(c=>c.Id);
var ppcReports=存储库
.FindAll(pr=>pr.ClientId==ClientId
&&activitids.Contains(pr.activitid))
.ToList();

这应该在EF和Linq to SQL中都可以使用。

可查询。当源为null时,Any()返回ArgumentNullException,如此处所述:

null exception?Sql不会抛出那个。
活动
是本地序列吗?第一个代码段总是使用这个。第二种方法仅在FindAll返回非空枚举时使用它。编辑:编辑后,我几乎可以肯定
活动
为空。在第一个代码中,linq试图使用它进行查询(因为它是本地序列,所以无论如何都会失败)。在第二段代码中,您可能没有进入循环。您是否跟踪sql请求到数据库(从ef)?顺便说一句,不要使用ToList()来迭代iQuery,使用ToArray()活动是一个本地列表,已经从数据库中填充了列表,我不明白的是,当列表被填充并和任何方法一起使用时,它为什么会返回null异常,而这些方法只是检查列表中是否有任何元素,所以它不应该返回null异常。在本例中,我使用的是NHibernate,我没有尝试将sql跟踪到数据库,我将在今天晚些时候尝试。
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
    }
}
var ppcReports = repository.
    FindAll<PPCReport>(x => x.ClientId == clientId).
    ToList().
    Where(w => campaigns.Any(c => c.Id == w.CampaignId)).
    ToList();
var campaignIds = (campaigns ?? Enumerable.Empty<Campaign>())
    .Select(c => c.Id);
var ppcReports = repository
    .FindAll<PPCReport>(pr => pr.ClientId == clientId
        && campaignIds.Contains(pr.CampaignId))
    .ToList();