C# 将sql查询重写为LINQ。找不到错误

C# 将sql查询重写为LINQ。找不到错误,c#,sql-server,entity-framework,linq,C#,Sql Server,Entity Framework,Linq,这是一个SQL查询: SELECT Website,VendorID,Name,LinkProduct, Link,Logo,Image,NameExtra as Industry, (SELECT [Percent] FROM Web_Promotion WHERE Web_Promotion.VendorID=Web_Vendor.VendorID) AS PercentOff

这是一个SQL查询:

SELECT Website,VendorID,Name,LinkProduct,
            Link,Logo,Image,NameExtra as Industry,
            (SELECT [Percent] FROM Web_Promotion 
            WHERE Web_Promotion.VendorID=Web_Vendor.VendorID) 
            AS PercentOff  
            FROM Web_Vendor WHERE Active='1' AND 
            (VendorID IN (Select VendorID FROM Web_Promotion 
            WHERE VendorID<>'' AND Static='True' AND [Percent] <> '0' AND 
            ((Expires>=GETDATE()) OR (Expires IS NULL))) OR 
            VendorID IN (SELECT TOP 1 SC1 FROM NavItems 
            WHERE SC1=Web_Vendor.VendorID AND Promotion<>'' 
            AND ((PromotionStart<=GETDATE() AND PromotionEnd>=GETDATE()) 
            OR (PromotionStart<=GETDATE() AND PromotionEnd IS NULL))))
            ORDER BY NameExtra,Sequence 
我需要把它改写成LINQ。这就是我的LINQ:

return await _db.Web_Vendor.
                    Where(x => !(x.WebPromotion.VendorID == string.Empty || x.WebPromotion.VendorID == null)
                    && x.WebPromotion.Static == true && x.WebPromotion.Percent != 0 &&
                    (x.WebPromotion.Expires >= DateTime.Now || x.WebPromotion.Expires == null)
                    ||
                    (_db.NavItems.Where(y => x.WebPromotion.VendorID == y.SC1
                        && !(y.Promotion == "" || y.Promotion == null)
                        && (y.PromotionStart <= DateTime.Now) && (y.PromotionEnd >= DateTime.Now || y.PromotionEnd == null))
                        .Select(g => g.SC1).Take(1).Contains(x.WebPromotion.VendorID)))
                    .Include(x => x.WebPromotion).Where(x => x.Active == true).OrderBy(x => x.NameExtra)
                    .ThenBy(x => x.Sequence).ToListAsync();
我花了大约三个小时,但找不到错误。原始SQL查询返回16行,但我的LINQ代码只返回其中的13行。不幸的是,我只有一个导航属性Web\u供应商Web\u促销。我认为我的问题的第二部分有一个错误:

||
                        (_db.NavItems.Where(y => x.WebPromotion.VendorID == y.SC1
                            && !(y.Promotion == "" || y.Promotion == null)
                            && (y.PromotionStart <= DateTime.Now) && (y.PromotionEnd >= DateTime.Now || y.PromotionEnd == null))
                            .Select(g => g.SC1).Take(1).Contains(x.WebPromotion.VendorID)))
有专家可以检查我的代码并帮助我吗? 正确数据: Linq data not correct包含与correct相同的数据,而不是PercentOff为null的值。
主要的问题是LINQ在这里生成内部连接而不是左连接:

既然您说您的LINQ数据在PercentOff=null时漏掉了这种情况,我就把重点放在这一点上

我猜您在Linq中的百分比是百分比属性,我看到您在where:x.WebPromotion.Percent!=0

这是一个可为null的值,还是将null转换为默认属性类型,即0


是否可以将null转换为0,然后查询跳过它?

一个重要的线索是查看两个查询都正确拾取的行中的数据,以及您认为不起作用的查询遗漏的行。我对Linq了解不多,但在我看来,查找字符串值“True”和布尔值“True”之间可能有区别?静态是EF映射中的boolen类型。我已经添加了数据,首先我建议您比较Linq查询和SQL查询。您可以使用SQL分析器。我使用了LinqPad,但我个人没有发现错误,我不会在LINQ中进行此类查询,而是有一个我要调用的存储过程。尽管对此观点不同: