我是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,所以我想避免使用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);
但这并没有让我整个零售商行返回访问零售商对象。
非常感谢任何建议。
谢谢..
答案 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
未知,将只提供一个null
或ID
。
另外,如果我说得对,你有一些多选,想要一次性获取所选零售商的清单。在这种情况下,您可以使用条件子句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