2

次のシナリオで最速のソリューションは何ですか:

オブジェクトのリストがあり、テーブル (SQLCE) の行に一致するオブジェクトを除外する必要があります。

以下は、疑似コードの 2 つの方法です。

DataContext dc = new DataContext();
var dbOjbToExclude = dc.Tables.Where(..).Select(r=>r);
foreach (var item in myOriList)
{
     if (!dbObjToExclude.Any(r=>r.prop1==item.prop1 && r.prop2==item.prop2))
         //add item to a new collection
}

上記で、ループ内の各項目に対して db クエリが複数回実行されると思いますか? オブジェクトの多くのプロパティのうち 2 つだけをチェックしています。もう 1 つの方法は、これら 2 つのプロパティだけを持つオブジェクトのデータ オブジェクト コレクションを取得し、そのコレクションで一致するものをチェックすることです。

DataContext dc = new DataContext();
var dbOjbToExclude = dc.Tables
                           .Where(..)
                           .Select(r=> new HelperObj {r.prop1,r.prop2})
                           .ToList<HelperObj>();
foreach (var item in myOriList)
{
     if (!dbObjToExclude.Any(r=>r.prop1==item.prop1 && r.prop2==item.prop2))
     //add item to a new collection
}

どちらが速いですか?私が言ったように、これは sqlce と linq から sql への組み合わせなので、どちらがパフォーマンス的に優れているか知りたいです。

4

1 に答える 1

0

複数の呼び出しと 1 つの呼び出しの違いは実際にはないと思います。どちらの場合も、DB に対するクエリは、foreach ループが結果リストを必要とするポイントで発生します。違いは、最初のクエリはテーブル全体を返しますが、2 番目のクエリは要求しているいくつかのフィールドのみを返すことです。したがって、2番目の方が効率的であると言えます。

于 2014-01-31T16:34:02.883 に答える