[英]Avoid DB calls to reduce memory
我是Linq的新手,请为我解决问题。 我试图避免数据库调用,因为加载页面需要花费很多时间。
var weeklyRetailers =
result.Where(i => i.ManufacturerId == manufacturerRow.Id && i.CountryId == countryRow.Id
&& i.CategoryId == categoryRow.Id && i.Date >= localStart && i.Date <= localEnd);
var retailer = _retailerRepository.GetRetailer(weeklyRetailer.RetailerId);
如果要选择太多的星期,那么不要去为每个零售商的电话都花太多时间的数据库,所以我要避免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;
}
var retailer = retailersListToIterate.Where(i => i.Id == weeklyRetailer.RetailerId);
但这并没有返回我整个零售商行来访问零售商对象。
任何建议将不胜感激。
谢谢..
的结果
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)
查询数据库。 只要您查询的零售商不超过4000家,这是安全的,因为这将在SQL中的SELECT FROM IN(ID1, ID2 ...)
语句中进行翻译,这对IN子句。
我有一种预感,您正在对IEnumerable对象进行过滤。 如果要执行DB操作并对数据集进行某些过滤,请始终对IQueryable对象而不是IEnumerable(List)对象进行过滤。 将节省您大量的浪费时间。 有关差异,请参见链接。 IQueryable和IEnumerable之间的区别
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.