我有一个复杂的查询,从数据库中的许多实体中进行选择。但我面临性能问题。数据需要很长时间才能检索到,而不像sql只需要几秒钟。
表:
Product
productPrice (it contains more than 20k rows)
Category
Store
查询:
var grid = from p in db.Products.ToList()
from productPrice in db.ProductPrices.ToList()
where p.ProductID == productPrice.ProductID
from c in db.Categories.ToList()
where c.CategoryID == p.ProductCategoryID
where c.CategoryID == subCategoryID
from u in db.Users.ToList()
where u.UserID == productPrice.UserID
where u.UserID == storeID
select new
{
ProductID = p.ProductID,
StoreName = u.Name,
ProductCateogry = c.CategoryName,
CategoryHsCode = c.CategoryHsCode,
ProductName = p.ProductName,
ProductBarcode = p.ProductBarcode,
Price = productPrice.Price,
PriceUnit = productPrice.Unit,
LoggedDate = productPrice.LoggedDate
};
查询或实体框架工作是否有问题选择所有数据然后过滤它?
答案 0 :(得分:2)
删除基本上将数据库完全加载到内存中的所有ToList
,然后 Where
过滤记录。 ToList
从表格中创建一个列表。
var grid = from p in db.Products
from productPrice in db.ProductPrices
where p.ProductID == productPrice.ProductID
from c in db.Categories
where c.CategoryID == p.ProductCategoryID
where c.CategoryID == subCategoryID
from u in db.Users
where u.UserID == productPrice.UserID
where u.UserID == storeID
select new
{
ProductID = p.ProductID,
StoreName = u.Name,
ProductCateogry = c.CategoryName,
CategoryHsCode = c.CategoryHsCode,
ProductName = p.ProductName,
ProductBarcode = p.ProductBarcode,
Price = productPrice.Price,
PriceUnit = productPrice.Unit,
LoggedDate = productPrice.LoggedDate
};
如果你想要一个列表作为最终结果(虽然我会初始化一个自定义类型而不是一个匿名类型):
var gridList = grid.ToList(); // loads only the filtered records into memory
在查询中使用ToList
,您还使用了Linq-To-Objects
,它无法从数据库索引或优化中受益。因此,表格不再与效率JOIN
相关联,而是使用笛卡尔积的inefficient(内存中)Where
。