我是林克的新手,请帮我解决我的问题。我试图避免DB调用,因为加载我的页面需要很长时间。
我的代码:
我每周计算一次零售商,这样我就能得到零售商的名单
var weeklyRetailers =
result.Where(i => i.ManufacturerId == manufacturerRow.Id && i.CountryId == countryRow.Id
&& i.CategoryId == categoryRow.Id && i.Date >= localStart && i.Date <= localEnd);现在,我让零售商行从DB访问零售商对象。
var retailer = _retailerRepository.GetRetailer(weeklyRetailer.RetailerId);备注
而不是为每个零售商调用DB,如果有太多的星期选择,这是太长的时间,所以我想避免Db调用。
所以我试着:
var retailersListToIterate = _retailerRepository.GetAllRetailersList();我的存储库功能
/// <summary>
/// Return a list of retailer row
/// </summary>
/// <returns></returns>
public List<Retailer> GetAllRetailersList()
{
List<Retailer> a = (from aa in _er.Retailers
orderby aa.Description ascending
select aa).ToList();
return a;
} 使用Linq
var retailer = retailersListToIterate.Where(i => i.Id == weeklyRetailer.RetailerId);但这并不是将整个零售商行返回到访问零售商对象。
如有任何建议,将不胜感激。
谢谢..
发布于 2013-11-11 13:20:13
结果
var retailer = retailersListToIterate.Where(i => i.Id == weeklyRetailer.RetailerId);不是Retailer对象,这是IEnumerable<Retailer>。因此,您应该检查它的长度等,而不是使用ElementAt(0)对您的结果。
或者写
var retailer = retailersListToIterate.SingleOrDefault(i => i.Id == weeklyRetailer.RetailerId);如果零售商Retailer是未知的,这将给你一个确切的ID或null。
另外,如果我把你说对了,你有一些多重选择,并希望在一次获得选定零售商名单到DB。在这种情况下,您可以创建带有零售商ID的列表,并使用条件子句where myListOfIds.Contains(i.Id)查询DB。只要您不查询超过4000家零售商,这是安全的,因为这将在SQL中被翻译成SELECT FROM IN(ID1, ID2 ...)语句,这对in子句中的元素数量有限制。
发布于 2013-11-11 13:51:43
我预感到您正在对IEnumerable对象进行过滤。如果要对数据集执行DB操作并进行某些筛选,请始终对IQueryable对象进行筛选,而不是对IEnumerable(列表)对象进行筛选。会让你免于浪费很多时间。有关差异,请参见链接。IQueryable与IEnumerable的区别
https://stackoverflow.com/questions/19907259
复制相似问题