我可以优化我的LINQ查询吗?

时间:2017-06-01 11:41:33

标签: c# linq linq-to-sql

我正在尝试使用LINQ创建我的第一个数据库查询。为了练习,我使用的是Microsoft的Adventure Works 2014数据库。

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();
}

1 个答案:

答案 0 :(得分: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))