私の Devart Entity Framework プロバイダーは、次の linq をエンティティに使用します。
from p in context.BEAT_CONTACT
join cl in context.COMPASS_LOCATIONS
on p.GAZETEER_KEY equals cl.GAZETTEER_KEY
//on new { bcdid = p.GAZETEER_KEY.Value }
//equals new { bcdid = cl.GAZETTEER_KEY.Value }
into myRandomlj
from rr in myRandomlj.DefaultIfEmpty()
注: 結合列は DB では null 許容型であるため、10 進数ですか? C#で
生成される SQL は次のとおりです。
FROM NP_TEST.BEAT_CONTACT "Extent1"
LEFT OUTER JOIN NOTTS_DW_OWNER.COMPASS_LOCATIONS "Extent2"
ON ("Extent1".GAZETEER_KEY = "Extent2".GAZETTEER_KEY)
* OR (("Extent1".GAZETEER_KEY IS NULL)
* AND ("Extent2".GAZETTEER_KEY IS NULL))
星印 (*) の OR と AND は、SQL の実行に余分な秒数を追加しています。ステートメントがヒキガエル(oracle devart ef provider btw)に配置され、スター付きのアイテムがrem'dされている場合、SQLは明らかにはるかに高速に実行されます。
私の質問は次のとおりです。エンティティへの私のlinqに問題がありますか、それとも何かが欠けていますか? それとも、Devart EF プロバイダーに問題がありますか?
質問の更新: こんにちは、この質問の最初の作成者として、可能であれば問題を明確にしたいと思います。LukLed のコメントから - 「デフォルトの Entity Framework プロバイダーは正しく機能し、そのような SQL 条件を作成しません。それは間違っているだけでなく、パフォーマンスを大幅に低下させます」. 私は主に「パフォーマンス ヒッター」のコメントが気になります。このヒットは、特に結合の両側で行数が増加するため、大規模です。ExecuteStoreQuery<> または Sproc を使用して、この動作を回避する必要がありました。これはlinqがないことを意味し、仕事を成し遂げるためにSQLハットをかぶる必要がありました。