避免DB调用以减少内存

时间:2013-11-11 13:11:25

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

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

我的代码:

我每周都在计算零售商,以便我可以获得零售商名单

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

但这并没有让我整个零售商行返回访问零售商对象。

非常感谢任何建议。

谢谢..

2 个答案:

答案 0 :(得分:2)

的结果
var retailer = retailersListToIterate.Where(i => i.Id == weeklyRetailer.RetailerId);

不是Retailer对象,而是IEnumerable<Retailer>。因此,您应该检查它的长度等,而不是在结果上使用ElementAt(0)

或写

var retailer = retailersListToIterate.SingleOrDefault(i => i.Id == weeklyRetailer.RetailerId);
如果零售商Retailer未知,

将只提供一个nullID

另外,如果我说得对,你有一些多选,想要一次性获取所选零售商的清单。在这种情况下,您可以使用条件子句where myListOfIds.Contains(i.Id)创建包含零售商ID和查询DB的列表。只要您不查询超过4000个零售商,这是安全的,因为这将在SQL中的SELECT FROM IN(ID1, ID2 ...)语句中进行翻译,这对IN子句中的元素数量有限制。

答案 1 :(得分:2)

我正在预测你正在对IEnumerable对象进行过滤。如果您正在进行数据库操作并对数据集进行一些过滤,请始终对IQueryable对象进行过滤,而不是对IEnumerable(List)对象进行过滤。将为您节省大量浪费的时间。有关差异,请参阅链接。 Difference between IQueryable and IEnumerable