如何在Entity Framework中生成带OR条件的Join查询?
如何用Entity Framework生成带OR条件的目标SQL查询?
目标SQL
想要实现带OR条件的内连接,对应的SQL语句如下:
SELECT COUNT(*) FROM Discounts JOIN DiscountArticles ON Discounts.ID = DiscountArticles.Discount JOIN Articles ON (DiscountArticles.Article = Articles.ID OR DiscountArticles.ArticleGroup = Articles.ArticleGroup)
参考方案中,Entity Framework无法直接实现上述内连接逻辑,可改用交叉连接实现,对应SQL如下:
SELECT COUNT(*) AS GroupCount FROM Discounts JOIN DiscountArticles ON Discounts.ID = DiscountArticles.Discount CROSS JOIN Articles WHERE (Articles.ID = DiscountArticles.Article OR Articles.ArticleGroup = DiscountArticles.ArticleGroup)
EF查询尝试与问题
尝试用EF编写如下查询:
var query = from discounts in _dbContext.Discounts join discountArticles in _dbContext.DiscountArticles on discounts.Id equals discountArticles.Discount from article in _dbContext.Articles where article.Id == discountArticles.Article || article.ArticleGroup.Value == discountArticles.ArticleGroup.Value select new { ArticleId = article.Id, DiscountId = discounts.Id };
但生成的SQL自动添加了额外的NULL判断条件 OR (([a].[ArticleGroup] IS NULL) AND ([d0].[ArticleGroup] IS NULL)),导致查询结果数量远超预期。推测问题源于ArticleGroup是两个实体中的*Nullable Guid?*类型。
若添加非空判断:
where article.Id == discountArticles.Article || article.ArticleGroup.HasValue && article.ArticleGroup == discountArticles.ArticleGroup
能得到正确结果,但生成的SQL条件更复杂:
WHERE ([a].[ID] = [d0].[Article]) OR (([a].[ArticleGroup] IS NOT NULL) AND ([a].[ArticleGroup] = [d0].[ArticleGroup]))
疑问
能否生成与目标SQL格式完全一致的查询,即WHERE条件为:
WHERE (Articles.ID = DiscountArticles.Article OR Articles.ArticleGroup = DiscountArticles.ArticleGroup)
内容的提问来源于stack exchange,提问作者Christian Gollhardt
相关产品推荐
相关产品推荐

