繁体   English   中英

避免数据库调用以减少内存

[英]Avoid DB calls to reduce memory

我是Linq的新手,请为我解决问题。 我试图避免数据库调用,因为加载页面需要花费很多时间。

我的代码:

我每周都在计算零售商,以便我可以获取retailerId的列表

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;
    } 

使用Linq

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM