IQueryable返回空值,IEnumerable没有

时间:2016-05-06 20:10:32

标签: c# linq ienumerable dto iqueryable

我有一个扩展方法,需要根据收到的IQueryable返回一些DTO。今天修改代码(我添加了一个新的int属性)我意识到该方法不再正常工作,将DTO列表的一部分作为空值返回。

我想知道我添加的属性是否可能是问题所以我将方法修剪为下面的方式,它仍然会返回一些空值。

public static IQueryable<OperationDto> SelectDto(this IQueryable<Operation> operations)
{
    return operations.Select(op=> new OperationDto
        {
            Id = op.Id
        });
}

我将方法改为

public static IEnumerable<OperationDto> SelectDto(this IQueryable<Operation> operations)
{
    return operations.AsEnumerable().Select(op=> new OperationDto
        {
            Id = op.Id
        });
}

并且它可以在不改变任何其他内容的情况下再次工作。

我不明白为什么IQueryable<OperationDto>突然停止工作(可能是新属性)以及为什么IEnumerable变体有效。

修改

在以下存储库方法中调用扩展方法:

  • 原始IQueryable版本:

    public IQueryable<OperationDto> FindOperationDtos(OperationModelFilter modelFilter)
    {
        IQueryable<Operation> filteredData = DbSet.AsQueryable();
    
        if (modelFilter.UserId.HasValue)
            filteredData = filteredData.Where(o => o.User.Id == modelFilter.UserId.Value);
    
        ...
    
        return filteredData.Distinct().SelectDto();
    }
    
  • IEnumerable版本:

    public IQueryable<OperationDto> FindOperationDtos(OperationModelFilter modelFilter)
    {
         IQueryable<Operation> filteredData = DbSet.AsQueryable();
    
         if (modelFilter.UserId.HasValue)
             filteredData = filteredData.Where(o => o.User.Id == modelFilter.UserId.Value);
    
         ...
    
         return filteredData.Distinct().SelectDto();
    }
    

0 个答案:

没有答案