2

データベースからデータを取得するために、SqlMetal(linq to sql)を使用しています。ただし、次のコードを使用すると異なる結果が得られます。

var record1 = Enumerable.FirstOrDefault(_dataContext.StaticPageLangs, 
              r => r.selected_partial_url_id == partialUrlid 
                && r.selected_last_part_url_id == lastPartUrlId 
                && r.language_id == languageId);

var record2 = _dataContext.StaticPageLangs.FirstOrDefault(
              r => r.selected_partial_url_id == partialUrlid
                && r.selected_last_part_url_id == lastPartUrlId
                && r.language_id == languageId);

このrecord1がいっぱいになった後、record2はNULLになり、同じであると予想されます。

誰かが違いを説明できますか?

編集:

補足:

r.selected_pa​​rtial_url_idはnull許容のintであり、比較されるプロパティも同様です。r.selected_last_part_url_idはint型であり、比較されるプロパティも同様です。r.language_idはint型であり、比較されるプロパティも同様です。

4

2 に答える 2

5

Enumerable.FirstOrDefault(...)を使用しているため、最初のクエリはメモリ内で実行されます。2番目のクエリは、データコンテキストによってSQLに変換され、データベースによって実行されます。

SQLプロファイラーをチェックして、実行される実際のクエリを確認し、違いを確認する必要があります。問題になる可能性のあるデータベース内のnull許容列はありますか?

アップデート

SQLステートメントに変換される式のnull許容プロパティを比較する場合、比較の両方の値がnullの場合、これがうまくいかない可能性があることに注意してください。例:

_dataContext.StaticPageLangs
    .FirstOrDefault(r => r.selected_partial_url_id == partialUrlid)

partialUrlid == NULLであり、selected_pa​​rtial_url_id == NULLのレコードが存在する場合、レコードは生成されません。理由:変換されたSQLには「selected_pa​​rtial_url_id == NULL」が含まれ、「selected_pa​​rtial_url_idISNULL」は含まれていません。

于 2012-07-25T12:31:08.827 に答える
1

注:次の回答は、存在する場合と存在しない場合に適用されますrecord1。これは質問の反対ですが、同様のシナリオを持つ他の読者には役立つ場合がありますnullrecord2null

推測しなければならない場合、そのうちの少なくとも1つ==はにありstring、これは大文字と小文字の区別の問題です。

record1はLINQ-to-Objectsから取得されているため、サーバーからすべての行をプルし、ローカルでテストしています。その場合、これら==は大文字と小文字が区別されます(C#/ .NET ==onstringは常に大文字と小文字が区別されます)。

record2を介してDB実装を使用しているようIQueryable<>です。これは、TSQLに変換されていることを意味します。SQL-Serverデータベースでは、大文字と小文字を区別することも、大文字と小文字を区別しないこともできます。大文字と小文字を区別しないように設定されていると思います。

たとえば、それlanguageId"en-us"C#と'EN-US'データベースにあると想像してみてください。

record1それは、であることにつながる可能性がありますnullrecord2、満たされています。

于 2012-07-25T12:32:11.193 に答える