我正在尝试使用LINQ创建我的第一个数据库查询。为了练习,我使用的是Microsoft的Adventure Works 2014数据库。
我的首要目标之一是为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 :(得分: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))