我遇到了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;
}
}