2015-06-25 4 views
1

У меня возникла проблема, когда запрос ниже занимает около 700 мс для выполнения. Он находится в цикле и получает вызов более 100 раз, так что он длится вечно.Проблемы с производительностью Framework Framework

Модель:

public class ReleaseDates 
{ 
    public int Id { get; set; } 
    public string MovieName { get; set; } 
    public string Country { get; set; } 
    public DateTime ReleaseDate { get; set; } 
    public string AlternateSource { get; set; } 
} 

Запрос:

public async Task<List<ReleaseDates>> GetReleaseDatesAsync(string movieName) 
{ 
    return await Db.ReleaseDates.Where(x => x.MovieName == movieName && string.IsNullOrEmpty(x.AlternateSource)).ToListAsync(); 
} 

Любые предложения, как ускорить этот процесс?

+0

Возьмите его из петли и изменить его так, есть только один запрос, чтобы получить все? Вы можете сохранить добавление, если условия не перечислены. – br4d

+0

Таблица - это очень большие 10 000-ти данных. Так хватало все, что я считал бы плохой идеей? –

+0

Возможно, вам нужно использовать хранимую процедуру для соединения и получить данные, которые вам нужны, вместо того, чтобы зацикливаться и передавать в movieName в 1 на 1 – dansasu11

ответ

3

Избавьтесь от петли. Это проблема. Вы отправляете много запросов в базу данных.

Сохраните все имена фильмов, которые вы ищете в списке, и там есть.

public async Task<List<ReleaseDates>> GetReleaseDatesAsync(List<string> movieNames) 
{ 
    //movie names that you're searching for - movieNames 

    return await Db.ReleaseDates.Where(x => movieNames.Contains(x.MovieName) && string.IsNullOrEmpty(x.AlternateSource)).ToListAsync(); 

} 

Если вы хотите, чтобы получить даты выпуска «Ant Moon», «GodZippa», «SuperWan», список будет содержать эти строки, и это он.

Некоторое дальнейшее чтение: http://blogs.msdn.com/b/alexj/archive/2009/03/26/tip-8-writing-where-in-style-queries-using-linq-to-entities.aspx

+0

Да, глупо от меня, когда я пытаюсь что-то сделать, я всегда получаю туннельное видение. –

2

Создайте индекс в поле имени фильма. Кроме того, поймайте запрос через профайлер и выполните его в Sql Management Studio с включенным Show Plan. Это даст вам некоторые идеи для оптимизации производительности запросов.

+0

Извините, новичок в EF, как бы создать индекс? –

+0

Выполняйте это прямо на Sql Server Management Studio. –

+0

Я использую первый подход кода. Не может ли это быть сделано с помощью модель или любая конфигурация EF? –