2

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

但这并没有让我返回整个 Retailer 行以访问 Retailer 对象。

任何建议将不胜感激。

谢谢..

4

2 回答 2

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或者null如果零售商ID未知。

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

于 2013-11-11T13:20:13.647 回答
2

我有一种预感,您正在对 IEnumerable 对象进行过滤。如果您正在执行数据库操作并对数据集进行一些过滤,请始终对 IQueryable 对象进行过滤,而不是对 IEnumerable(List) 对象进行过滤。将为您节省大量浪费的时间。区别见链接。 IQueryable 和 IEnumerable 之间的区别

于 2013-11-11T13:51:43.050 回答