2017-06-01 60 views
0

我想用LINQ創建我的第一個數據庫查詢。對於練習,我使用的是Microsoft的Adventure Works 2014數據庫。我可以優化我的LINQ查詢嗎?

DB Diagram

我的第一個目標之一是爲DataService創建靜態方法,返回給定供應商名稱的所有產品的列表。它看起來像我的方法返回正確的數據,但我認爲它是非常糟糕的優化。我能以某種方式改進它嗎?

public static List<Product> GetProductsByVendorName(string vendorName) 
{ 
    AdventureWorksDatabaseClassDataContext dc = new AdventureWorksDatabaseClassDataContext(); 
    int vendorID = dc.Vendors.Where(vendor => vendor.Name == vendorName).Select(vendor => vendor.BusinessEntityID).First(); 

    IEnumerable <ProductVendor> productsVendor = dc.ProductVendors; 
    IEnumerable<int> selectedProductsID = from ProductVendor productVendor in productsVendor 
              where productVendor.BusinessEntityID == vendorID 
              select productVendor.ProductID; 

    IEnumerable<Product> products = dc.Products; 
    IEnumerable<Product> selectedProducts = from Product p in products 
              where selectedProductsID.Contains(p.ProductID) 
              select p; 

    return selectedProducts.ToList(); 
} 
+0

看起來你正在編寫代碼連接。代之以將其寫入查詢中。 – CodeCaster

+4

我投票結束這個問題作爲題外話,因爲沒有指定此代碼的具體問題。考慮在https://codereview.stackexchange.com上提出重構問題 –

+2

好的,使用單個查詢而不是三個不同的查詢。 –

回答

1

您應該使用連接數據庫端,以避免過度網絡和負載實體的數據傳輸到內存:

from v in dc.Vendors 
join pv in dc.ProductVendors on v.BusinessEntityID equals v.BusinessEntityID 
join p in dc.Products on p.ProductID equals pv.ProductID 
where v.Name == vendorName 
select p 

請注意,如果您有導航屬性的正確安裝,那麼這個查詢可以看起來像

dc.Vendors.Where(v => v.Name == vendorName) 
    .SelectMany(v => v.ProductVendors.Select(pv => pv.Product))