4

私の 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ハットをかぶる必要がありました。

4

2 に答える 2

2

それは完全に問題なく、期待どおりに機能します。追加の条件により、両方がSQLに当てはまらないnullという事実が原因である場合に確実に結合されますnull = null

于 2011-02-14T17:11:43.593 に答える
1

@K Ivanov、あなたは正しいです。2 つの null の場合も考慮に入れる必要があり、スター付きの句がそのトリックを行います。

于 2011-02-15T12:08:15.977 に答える