5

私は C# (C++ のバックグラウンド) を学んでおり、LINQ 式について質問があります。次の 2 つの関数はどちらも同じことを行います (ほぼ同じです)。ウォンバットの種類はSystem.Data.Linq.Table<Wombat>.

興味があります

  1. どちらがより効率的ですか?
  2. それも問題ですか?
  3. 代わりに、IQueryqble を返すことで得られるものはありますか?
  4. 3つのうちの1つを好むエチケットはここにありますか?

私の推測では、2 番目の方が効率的ですが、wombat テーブルに何百万もの wombat が存在しない限り、それほど重要ではありません。IQueryable を返すことは、1 つのウォンバットしか返さないため、それほど重要ではないようです。

前もって感謝します!

    public static DBConnector.Connections.Wombat getWombat(String wombatID)
    {
        var db = getDBInstance();
        return db.Wombats.FirstOrDefault(x => x.ID.ToString() == wombatID);
    }

    public static DBConnector.Connections.Wombat getWombat(String wombatID)
    {
        var db = getDBInstance();
        var guid = new System.Guid(wombatID);
        return db.Wombats.FirstOrDefault(x => x.ID == guid);
    }
4

4 に答える 4

7

これは、DB の LINQ プロバイダーと、これを SQL に変換する方法に完全に依存します。結果の SQL をプロファイリングし(または単にSQL トレースを調べて)、どちらがより効率的かを判断できます。

実際のチェックは同じタイプになるため、ほとんどのプロバイダーは 2 番目のオプションを使用したほうがうまくいくと思います。サーバー上のクエリでは、各行を文字列に変換し、文字列比較によって比較する必要はありません。これにより、インデックス作成が適切に機能し、はるかに効率的になります。そうは言っても、巧妙なプロバイダーがこの変換を行うことができます。その場合、2 つのオプションは同一である可能性があります。

于 2013-01-23T17:10:20.890 に答える
5

あなたの推測は正しいです。2 番目のクエリは、各行の GUID を文字列に変換するのではなく、GUID を 1 回解析するため、より効率的である可能性があります。クエリ プロバイダーはこれを最適化できますが、そうする必要はありません。クエリ プロバイダーが比較のために GUID を文字列に変換することを選択する可能性もありますが、それはかなり残念な選択です。

Wombatまた、テーブルにかなりの数のオブジェクトがない限り問題にならないと仮定することも正しいです。

2 番目のクエリを支持する大きな違いが 1 つあります。ToStringメソッドがクエリ プロバイダーによって認識されない可能性があるため、実行時エラーが原因で最初のクエリが実行されることさえありません。

于 2013-01-23T17:08:37.840 に答える
3
  1. ケースごとに生成された sql を見てください。
  2. SQL Studio で各クエリの実行時間、クエリ プラン、および IO を調べます。
  3. ???
  4. 利益。
于 2013-01-23T17:10:27.080 に答える
1

IQuerable を返すと、評価を遅らせることができ、他の誰かが最初に値を更新できるようになります。

于 2013-01-23T17:08:17.807 に答える