"其中"扩展返回List上的重复记录但不返回IQueryable

时间:2015-06-25 20:53:12

标签: c# asp.net asp.net-mvc entity-framework

我遇到了Where声明的问题;我有一个对象和一个方法来获取其记录

public class VehiclePart
{ 
   public int VehicleId { get; set; }
   public string PartNumber { get; set; }
   // and other properties
}


public List<VehiclePart> GetByVehiclePartsByVehicleId(int vehicleId, string partNumber)
{
    var vehicleParts = GetAll(); //returns IQueryable from EF repo
    var thisVehiclesParts = vehicleParts.Where(g => g.VehicleId == vehicleId).ToList();
    var parts = thisVehiclesParts.Where(g => g.PartId == partNumber).ToList();

    return parts;
}

以上陈述合理;但是我们想要改变它以使用整个表的缓存机制。实现之后,我们删除了缓存片,并在GetAll()方法上调用了.ToList()。这应该将整个表带回到内存中的List集合中。这有效,我们在列表中收到与表中相同数量的记录。请参阅下面的更改

public List<VehiclePart> GetByVehiclePartsByVehicleId(int vehicleId, string partNumber)
{
    var vehicleParts = GetAll().ToList(); //resolve query here to a list in memory
    var thisVehiclesParts = vehicleParts.Where(g => g.VehicleId == vehicleId).ToList();
    var parts = thisVehiclesParts.Where(g => g.PartId == partNumber).ToList();

    return parts;
}

现在出现的问题是我们已经应用了.Where(g =&gt; g.VehicleId == vehicleId).ToList();对于.Net内存堆中的列表对象,我们得到重复的结果,就像我们在GetAll()方法之后没有解析查询并让.Where()方法应用于IQueryable时,我们不会重复结果。 / p>

以下修复了问题

.Where(g => g.VehicleId == vehicleId).Distinct().ToList();

我现在只使用Distinct()方法接收唯一记录;但是当.Where方法应用于List而不是IQueryable时,为什么会收到重复记录?应该在哪里过滤列表并仅返回一次项目,而不是在10-20次之间看到重复。

对于任何想要查看GetAll代码的人

public class EntityService<T> : IEntityService<T> where T: BaseEntity.Entity
{
    protected IContext _context;
    protected DbSet<T> _dbset;
    protected NagsService(IContext context)
    {
        _context = context;
        _dbset = _context.Set<T>();
    }
    public IQueryable<T> GetAll()
    {
        return _dbset;
    }
}

0 个答案:

没有答案