[英]C# Linq to MySQL query with join makes bad SQL?
我正在使用 C# 將 LINQ 寫入 MySQL 數據庫。 我認為對於我正在做的簡單表連接,生成的 SQL 可能是錯誤的。
我的 nuget 包是 Mysql.Data v6.9.9、Mysql.data.entities v6.8.3 和 MySql.data.entity v6.9.9
LINQ是這樣的:
query = from peopleResult in query
join t in technologyQuery on peopleResult.Company_Id equals t.Company_Id
select peopleResult;
生成的 SQL 如下所示:
SELECT ...
FROM `people` AS `Extent1`
INNER JOIN `technologies` AS `Extent2` ON (`Extent1`.`Company_Id` = `Extent2`.`Company_Id`) OR ((`Extent1`.`Company_Id` IS NULL) AND (`Extent2`.`Company_Id` IS NULL))
WHERE ...
這部分加入對嗎?
(`Extent1`.`Company_Id` IS NULL) AND (`Extent2`.`Company_Id` IS NULL)
當包含該查詢時,該查詢的運行時間非常長。 我使用正則表達式將其從 SQL 中提取出來,它運行得更快,並且似乎給出了正確的結果。
我的 LINQ 是否不正確或遺漏了什么? MySQL linq-to-sql 可能有錯誤嗎?
感謝您花時間思考這個問題。
這不是 MySQL 連接器錯誤,而是 EF 功能,它試圖模擬可空類型的 C# 相等規則。
首先,確保將DbContext.Configuration.UseDatabaseNullSemantics
設置為true
,例如在您的DbContext
派生類構造函數中:
Configuration.UseDatabaseNullSemantics = true;
根據想法,這應該可以解決問題。 然而,他們為比較運算符實現了它並忘記了連接。 所以你必須使用帶有where
子句的替代連接語法:
query =
from peopleResult in query
from t in technologyQuery
where peopleResult.Company_Id == t.Company_Id
select peopleResult;
這將被轉換為沒有IS NULL
部分的所需 SQL JOIN
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.