C# Linq在实体框架和SQL存储过程上的性能

C# Linq在实体框架和SQL存储过程上的性能,c#,performance,linq,entity-framework,C#,Performance,Linq,Entity Framework,我们正在使用实体框架获取一些数据。LINQ查询使用多个联接,如下面的代码所示。我被要求将其更改为SQL存储过程,因为它更快。我如何优化这个LINQ代码,为什么它很慢 var brands = (from b in entity.tblBrands join m in entity.tblMaterials on b.BrandID equals m.BrandID join bm in ent

我们正在使用实体框架获取一些数据。LINQ查询使用多个联接,如下面的代码所示。我被要求将其更改为SQL存储过程,因为它更快。我如何优化这个LINQ代码,为什么它很慢

var brands = (from b in entity.tblBrands
                          join m in entity.tblMaterials on b.BrandID equals m.BrandID
                          join bm in entity.tblBranchMaterials on m.MaterialID equals bm.MaterialID
                          join br in entity.tblBranches on bm.BranchID equals br.BranchID
                          where br.BranchID == branch.branchId
                          select new Brand { brandId=b.BrandID, brandName=b.BrandName, SAPBrandId=b.SAPBrandID}).Distinct();
            return brands.ToList();

我怀疑主要的性能问题是由于我的一个主要抱怨。滥用关键字join

由于使用了JOIN,您得到的结果太多。所以你用了一个不同的。更糟糕的是,您这样做是为了外部结果集,SQL server没有索引

var brands = from b in context.Brands
where 
    (from m in context.Materials 
        where b.BrandID == m.BrandID 
        where (from bm in context.BranchMaterials 
                where (from br in context.Branches
                        where bm.BranchID == br.BranchID
                        where br.BranchID == branch.branchId
                        select br).Any()
                where m.MaterialID == bm.MaterialID select bm).Any()
        select m).Any()
    ).Any()
select b;
应该更有表现力。然而,这仍然是错误的。因为在使用ORMs时,我们应该考虑关联而不是连接。假设您的模型有任何意义,我将执行以下操作

var brands = from b in context.Brands
             where (from m in b.Materials
                    //Assuming that BranchMaterials is just a Many-Many mapping table
                    from br in m.Branches
                    where br.BranchID == branch.branchId).Any()     
                select new Brand { brandId=b.BrandID, brandName=b.BrandName, SAPBrandId=b.SAPBrandID};

无论谁告诉你存储过程更快,都是完全错误的。EF使用参数化查询,这些查询实际上是临时存储过程。