我們來看看下面的代碼,這個代碼是一個INNER JOIN的EF Core查詢,其中用SubCategory表INNER JOIN了SubCategoryLanguage表,但是我們需要在SubCategoryLanguage表上只查詢出其DataStatus等於1的行,所以需要用到子查詢:
var count = dbContext.SubCategory.Where(e => e.CategoryCode == "0e3b0d17-516e-489e-9df3-3ecda10d14eb" && e.DataStatus == 1) .Join(dbContext.SubCategoryLanguage.Where(e => e.DataStatus == 1), sc => sc.SubCategoryCode, sl => sl.SubCategoryCode, (sc, sl) => new { sc.SubCategoryCode, sl.LanguageCode, sl.SubCategoryName }) .Count(s => s.SubCategoryName == "category001" && s.LanguageCode == "CN");
如上面代碼黃色高亮所示,我們在SubCategoryLanguage表的查詢中加上了DataStatus == 1的查詢條件,運行該代碼使用EF Core的后台日志我們可以看到生成的SQL如下:
=============================== EF Core log started ===============================
Executed DbCommand (176ms) [Parameters=[], CommandType='Text', CommandTimeout='0']
SELECT COUNT(*)
FROM [MD].[SubCategory] AS [e]
INNER JOIN (
SELECT [e0].*
FROM [MD].[SubCategoryLanguage] AS [e0]
WHERE [e0].[DataStatus] = 1
) AS [t] ON [e].[SubCategoryCode] = [t].[SubCategoryCode]
WHERE (([e].[CategoryCode] = N'0e3b0d17-516e-489e-9df3-3ecda10d14eb') AND ([e].[DataStatus] = 1)) AND (([t].[SubCategoryName] = N'category001') AND ([t].[LanguageCode] = N'CN'))
=============================== EF Core log finished ===============================
我們可以看到在生成的SQL中,INNER JOIN在SubCategoryLanguage表上使用了子查詢,在黃色高亮部分我們還可以看到其加上了WHERE條件[DataStatus] = 1。所以在EF Core中使用Join的時候,是可以使用子查詢來限制Join表的查詢條件的。
