实体框架4对于书呆子晚餐FindByLocation的修改确实很慢

时间:2011-02-10 13:58:00

标签: linq entity-framework-4 nerddinner

我修改了书呆子晚餐示例,找到指定位置附近的位置。从平面表中选择性能是好的,但我想分割表,所以我有一个通用坐标表(SDB_Geography),并且还加入一个表,其中包含我称之为实体类型(HB_Entity)的特定数据。

我制作了一个名为HbEntityModel的新模型,它存储实体,hb和地理“子模型”。现在的问题是这个查询大约需要5秒钟才能执行。我认为通过这样做可以略微降低性能但是5秒就是荒谬的。有关如何使用currrent表设置提高性能的任何想法,还是我必须回到一个可怕的平台?

public IEnumerable<HbEntityModel> FindByLocation(float latitude, float longitude) 
{
    return (from entity in db.SDB_Entity.AsEnumerable()
                join nearest in NearestEntities(latitude, longitude, 2) 
                on entity.EntityId equals nearest.EntityId
                join hb in db.HB_Entity
                on entity.EntityId equals hb.EntityId
                join geo in db.SDB_Geography
                on entity.GeographyId equals geo.GeographyId
                select new HbEntityModel(entity, hb, geo)).AsEnumerable();
}

更新

所有表格包含大约14000条记录。

SDB_Entity 1:0/1 SDB_Geography

SDB_Entity 1:0/1 HB_Entity

搜索产生大约70个HbEntityModels。

如果从单个表中选择相同的查询需要0.3秒,使用IQueryable而不是IEnumerable。

1 个答案:

答案 0 :(得分:1)

我在Robban的帮助下找到了如何做到这一点。“请参阅this post.

我重写了函数以使用无参数构造函数,然后可以使用IQueryable。

        public IQueryable<HbEntityModel> FindByLocation(float latitude, float longitude) 
    {
        return (from entity in db.SDB_Entity
                    join nearest in NearestEntities(latitude, longitude, 2) 
                    on entity.EntityId equals nearest.EntityId
                    join hb in db.HB_Entity
                    on entity.EntityId equals hb.EntityId
                    join geo in db.SDB_Geography
                    on entity.GeographyId equals geo.GeographyId
                    select new HbEntityModel() { Shared=entity, Specific=hb, Geography=geo }).AsQueryable();
    }

现在查询执行大约需要0.4秒,这在某种程度上是可以接受的。希望当我的平均机器到来时,事情会更快。如果有人可以给我提示如何改进查询,使用存储过程或设置一些索引,我将非常感激。