Entity Framework длительный запрос - PullRequest
1 голос
/ 07 марта 2012

В моей БД есть View "RqstLst", я создаю EF Model из БД.Теперь у меня есть сущность RqstLst.

Существует два варианта одного и того же запроса

public void MyMethod()
{
     context = new WaterMEntities();
     var query = context.RqstLst;
     dgRqstLst.ItemsSource = query;  //dgRqstLst - DataGrid in WPF
}

и

public void MyMethod()
{
    dgRqstLst.ItemsSource = this.GetRqstLst();
}
private IEnumerable<RqstLst> GetRqstLst()
{
        context = new WaterMEntities();
        string nativeSQLQuery = "SELECT  * " +
                                    "FROM dbo.RqstLst ";
        ObjectResult<RqstLst> requestes =
            context.ExecuteStoreQuery<RqstLst>(nativeSQLQuery);
        return requestes;
}

время выполнения для первого варианта (LINQ to Entities)19 сек, в течение секунды, менее 1 сек.Я смотрю это в SQL Server Profiler.Что я делаю не так в первом варианте?

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Вы ничего не сделали неправильно с первым вариантом, но в зависимости от вашей конфигурации запрос, сгенерированный первым, может быть намного более сложным, чем ваше прямое выполнение SQL.Вы использовали профилировщик, чтобы увидеть, какой именно SQL генерирует первый запрос?Например, если RqstLst является абстрактным базовым классом, использующим наследование TPT, сгенерированный SQL может быть огромным.

1 голос
/ 07 марта 2012

Одно большое отличие состоит в том, что ExecuteStoreQuery не присоединяет возвращенные объекты к контексту (по крайней мере, не используемую вами перегрузку), но ваш первый запрос делает (что стоит времени).

Попробуйтеопределите такое же поведение отслеживания в первом запросе, как во втором запросе (= NoTracking):

context = new WaterMEntities();
context.RqstLst.MergeOption = MergeOption.NoTracking; // in System.Data.Objects
var query = context.RqstLst;
dgRqstLst.ItemsSource = query; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...