0

アイテムのリストを呼び出し、foreach ループを使用して各レコードを同じテーブル内の他のレコードと比較するパフォーマンスの問題があります。データベースへの1回の呼び出しでこれを行う方法はありますか? 現在、大きなテーブルと比較すると、このクエリの実行は非常に遅くなります。

Entity Framework 5 を使用しています。

次に例を示します。

var animals = new List<Animal>
{
    new Animal 
    {
        Id = 1,
        Name = "Tiger",
        Birthday = new DateTime(2012, 01, 01, 9, 0, 0)
    },
    new Animal 
    {
        Id = 2,
        Name = "Tiger",
        Birthday = new DateTime(2012, 01, 01, 20, 0, 0)
    },

    new Animal 
    {
        Id = 3,
        Name = "Lion",
        Birthday = new DateTime(2012, 01, 01, 7, 0, 0)
    },

    new Animal 
    {
        Id = 4,
        Name = "Lion",
        Birthday = new DateTime(2012, 01, 01, 14, 0, 0)
    },

};

var animalsToCompareTo = animals.Where (a => a.Id == 2 || a.Id = 4);

foreach (var animalToCompareTo in animalsToCompareTo)
{
    bool isTheSecondTigerOfTheDay = animals.Any (a => a.Name == animalToCompareTo.Name &&
                                                    a.Birthday.Day == animalToCompareTo.Birthday.Day &&
                                                    a.Birthday.Month == animalToCompareTo.Birthday.Month &&
                                                    a.Birthday.Year == animalToCompareTo.Birthday.Year &&
                                                    a.Birthday < animalToCompareTo.Birthday
                                                    );  

    if (isTheSecondTigerOfTheDay)
    {
        //do something
    }
}
4

2 に答える 2

0

animalsここに Entity Framework クエリの代用があると思いますか? その場合、最初のステップは、テーブルが適切にインデックス付けされていることを確認することです。第 2 に、生年月日を別の列Dateと列に格納することを検討することもできます (型が導入されTimeた SQL Server 2008 以降を使用していると仮定します)。Timeこれにより、より簡潔なクエリを作成できるだけでなく (年、月、日の 3 つの比較ではなく、日付の 1 つの比較のみ)、はるかに高速になります。テーブルの生年月日列にインデックスを付けても、値を変換しているため、インデックスは無視されます (クエリは を使用しますDATEPART)。

生年月日の列を別々の列に分割し、それらの 3 つの列に (名前、生年月日、生年月日の順で) インデックスを配置すると、非常に迅速なクエリが得られます。

于 2013-07-24T21:59:36.113 に答える
0

「各レコードを同じテーブル内の他のレコードと比較する」と言うと、グループ化を説明しているように聞こえます。比較に複数の大なり/小なりの比較が含まれる場合、扱いにくい場合がありますが、同等性をチェックしている限り、次のようなものが機能する可能性があります。

var secondAnimalsBornInDay =
    from animal in context.Animals
    group animal 
    by new 
    {
        animal.Name,
        animal.Birthday.Day,
        animal.Birthday.Month,
        animal.Birthday.Year,
    } 
    into groupOfAnimalsWithSameNameAndBirthday
    select groupOfAnimalsWithSameNameAndBirthday
           .OrderByDescending(a => a.Birthday)
           .Skip(1)
           .FirstOrDefault();

これにより、生まれた日にその名前を持つ 2 番目に生まれた動物のリストが得られます。それはあなたが探しているものですか、それともサンプルコードの結果を誤解していますか? secondAnimalsBornInDay(その名前が生まれた日に生まれた唯一の動物であった各動物の null が含まれていることに注意してください。そのため、それらを除外する必要があります。)

于 2013-07-24T23:52:55.630 に答える