如何在nopCommerce c#中将商店程序转换为linq

时间:2017-03-14 12:29:07

标签: c# linq nopcommerce

如何在nopCommerce c#

中将商店程序转换为linq

我的商店程序查询

SELECT p.Id
FROM Product p WITH (NOLOCK)
LEFT JOIN Discount_AppliedToProducts dap WITH (NOLOCK)
    ON p.Id = dap.Product_Id
LEFT JOIN Product_Category_Mapping pcm WITH (NOLOCK)
    ON p.Id = pcm.ProductId
LEFT JOIN Discount_AppliedToCategories dac WITH (NOLOCK)
    ON pcm.CategoryId = dac.Category_Id
        AND dac.Category_Id IN (1 ,2 ,3 ,4 ,5 ,6)
LEFT JOIN Product_Manufacturer_Mapping pmm WITH (NOLOCK)
    ON p.Id = pmm.ProductId
LEFT JOIN Discount_AppliedToManufacturers dam WITH (NOLOCK)
    ON pmm.ManufacturerId = dam.Manufacturer_Id
WHERE dap.Discount_Id IN (3)
    OR dac.Discount_Id IN (3)
    OR dam.Discount_Id IN (3)

我的linq查询

var productlist = (from q in _productRepository.Table
                                       select q).ToList();

var discount_AppliedToProductIds = (from dp in _discountRepository.Table
                                    from p in dp.AppliedToProducts
                                    select p).ToList().DistinctBy(d => d.Id).ToList();

var discount_AppliedToCategorieIds = (from dp in _discountRepository.Table
                                      from c in dp.AppliedToCategories
                                      select c).ToList().DistinctBy(d => d.Id).ToList();

var discount_AppliedToManufacturerIds = (from dp in _discountRepository.Table
                                         from m in dp.AppliedToManufacturers
                                         select m).ToList().DistinctBy(d => d.Id).ToList();

var product_Manufacturer_Mapping = (from dp in productlist
                                    from pm in dp.ProductManufacturers
                                    select pm).ToList().DistinctBy(d => d.Id).ToList();

var product_Category_Mapping = (from dp in productlist
                                from pc in dp.ProductCategories
                                select pc).ToList().DistinctBy(d => d.Id).ToList();

var ss = (from p in productlist
      join dap in discount_AppliedToProductIds on p.Id equals dap.Id
      join pcm in product_Category_Mapping on p.Id equals pcm.ProductId
      //join dac in discount_AppliedToCategorieIds on pcm.CategoryId equals dac.Id
      from dac in discount_AppliedToCategorieIds
      join pmm in product_Manufacturer_Mapping on p.Id equals pmm.ProductId
      join dam in discount_AppliedToManufacturerIds on pmm.ManufacturerId equals dam.Id
      from dapd in dap.AppliedDiscounts
      from pacd in dac.AppliedDiscounts
      from damd in dam.AppliedDiscounts
      where discountIds.Any(d => dapd.Id == d || d == pacd.Id || d == damd.Id)
      // innner join condition
      where categoryIds.Any(d => d == dac.Id) && dac.Id == pcm.CategoryId    
    select p).ToList();

我已将此代码写入c#,但此代码未提供正确的结果。现在我不知道这段代码有什么问题。如果我将此代码运行到sql server中,那么我得到了正确的结果,但是在c#代码中我没有得到正确的结果。

1 个答案:

答案 0 :(得分:0)

自从我在LINQ中编写查询以来已经很长时间了,但我似乎记得如果你想建模LEFT JOIN,你必须使用DefaultIfEmpty(),否则你最终会得到一个INNER JOIN。

看到这个,它的答案显示了应用DefaultIfEmpty的位置:

Linq join iquery, how to use defaultifempty

显然,如果你没有正确建模LEFT JOIN表达式,只有当所有3个输入产生值时,你才会得到结果。

我还建议不要在每个源查询上使用.ToList(),因为它会将数据显示到内存中并使用LINQ to Objects进行最终查询。如果删除.ToList(),LINQ将为整个过程构建单个数据库查询。

标记