0

我有一个性能问题,我正在调用一个项目列表,然后使用 foreach 循环将每条记录与同一张表中的其他记录进行比较。有没有办法通过一次调用数据库来做到这一点?现在,与大表相比,此查询运行速度非常慢。

我正在使用实体框架 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

当您说“将每条记录与同一张表中的其他记录进行比较”时,听起来有点像您在描述分组。如果您的比较涉及多个大于/小于比较,则可能会很棘手,但只要您检查相等性,这样的事情可能会起作用:

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();

这为您提供了一个动物列表,这些动物是在它们出生的那一天出生的第二个有名字的动物。那是您要查找的内容,还是我误解了您的示例代码的结果?(请注意,secondAnimalsBornInDay每只动物都将包含空值,这是唯一在其出生当天出生的动物,因此您需要将其过滤掉。)

于 2013-07-24T23:52:55.630 回答
0

我假设这animals是实体框架查询的替身?如果是这样,第一步是确保您的表被正确索引。其次,您可能会考虑将生日存储在单独的Date列中Time(假设您使用的是 SQL Server 2008 或更高版本,其中Time引入了类型)。这将使您不仅可以创建更简洁的查询(仅对日期进行一次比较,而不是对年、月和日进行三个比较),而且速度也会快得多。即使您索引表中的生日列,索引也会被忽略,因为您正在转换值(查询将使用DATEPART)。

如果您将生日列拆分为单独的列,然后在这三列上放置一个索引(按姓名、生日、出生时间顺序),您应该有一个非常快速的查询。

于 2013-07-24T21:59:36.113 回答