Entity Framework 4 действительно тормозит на ужине с модификацией FindByLocation - PullRequest
0 голосов
/ 10 февраля 2011

Я изменил пример обеда для ботаников, чтобы найти места в непосредственной близости от указанной позиции. При выборе из плоской таблицы производительность хорошая, но я хотел разделить таблицы, чтобы у меня была общая таблица координат (SDB_Geography), а также объединить таблицу с конкретными данными для того, что я называю типом объекта (HB_Entity). *

Я создал новую модель под названием HbEntityModel, в которой хранятся «подмодели» сущностей, hb и географии. Теперь проблема в том, что выполнение этого запроса занимает около 5 секунд. Я рассчитывал, что при этом получу небольшое снижение производительности, но 5 секунд просто смешно. Любые идеи о том, как улучшить производительность с настройкой текущего стола или мне нужно вернуться к чудовищному плоскому столу?

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

UPDATE

Все таблицы содержат около 14000 записей.

SDB_Entity 1: 0/1 SDB_Geography

SDB_Entity 1: 0/1 HB_Entity

Поиск дает около 70 HbEntityModels.

Если при выборе из одной таблицы тот же запрос занимает 0,3 с, используя IQueryable вместо IEnumerable.

1 Ответ

1 голос
/ 11 февраля 2011

Я узнал, как это сделать с некоторой помощью Роббана ". См. в этом посте.

Я переписал функцию, чтобы использовать конструктор без параметров, а затем мог использовать 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 секунды, что несколько приемлемо. Надеемся, что все будет быстрее, когда прибудет моя средняя машина. Если кто-то может дать мне подсказки о том, как улучшить запрос, используйте хранимую процедуру илиустановить индекс, я был бы более чем благодарен.

...