簡體   English   中英

帶有連接的 C# Linq 到 MySQL 查詢會使 SQL 變得糟糕嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM