LINQ从许多表中选择数据

时间:2014-09-09 07:33:49

标签: c# sql entity-framework linq-to-sql

我有一个复杂的查询,从数据库中的许多实体中进行选择。但我面临性能问题。数据需要很长时间才能检索到,而不像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
                   };

查询或实体框架工作是否有问题选择所有数据然后过滤它?

1 个答案:

答案 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