Проверка установки Entity Framework 5

У меня есть проект ASP.NET MVC 3, использующий.NET Framework 4.0 и LINQ to SQL. Поскольку у меня возникают серьезные проблемы с производительностью при выполнении некоторых запросов при первом их выполнении, я решил использовать Entity Framework 5, чтобы воспользоваться новой функцией автоматической компиляции LINQ.

Теперь я установил VS 2012, .NET Framework 4.5 и Entity Framework 5 и изменил свой проект, указав на.NET Framework 4.5, а также обновил файл контекста данных, чтобы использовать EF5. Теперь запросы имеют одинаковую производительность, некоторые из них настолько медленны при первом выполнении, что даже если я получаю исключение тайм-аута, во второй раз все нормально, мне интересно, если проблема в том, что, возможно, процесс миграции не был правильно, и я все еще использую EF4, или это просто проблема построения моего запроса, который не может использовать функцию автоматической компиляции по неизвестной причине.

DLL EntityFramework имеет версию 5.0, а dll System.Data.Entity версии 4, верно, не так ли? Какие-либо предложения?

Я включил наиболее проблемный запрос, он получает постраничный результат для сетки (Telerik MVC grid), которую мне нужно построить через 2 запроса (изначально это было предложение SQL с подзапросом):

     /// <summary>
    /// Get the elements for the AppLog grid.
    /// </summary>
    public void GetAppLogElements(
        int clientID, string language, int functionID, int errorLevel,
        int numPage, int pageSize, IList<IFilterDescriptor> filterDescriptors, IList<SortDescriptor> sortDescriptors, IList<GroupDescriptor> groupDescriptors,
        ref IQueryable<Model_AppLog> rows, ref int numRows)
    {
        string orderString = string.Empty;

        var items =
            from ap in objDataContext.applicationLogs
            where
                ap.clientID == clientID &&
                ap.recordGroup != null
            join alf in objDataContext.appLogFunctions on
                new { functionID = ap.functionID.Value } equals new { functionID = alf.functionID }
            join ale in objDataContext.appLogErrorLevels on
                new { errorLevel = ap.errorLevel.Value } equals new { errorLevel = ale.errorLevelID }
            join als in objDataContext.appLogSeverities on
                new { severity = ap.severity.Value } equals new { severity = als.severityID }
            group new { ap, alf, als } by new { ap.functionID, ap.recordGroup, ap.clerkID } into queryGrouped
            select new Model_AppLog()
            {
                sequence = queryGrouped.Max(c => c.ap.sequence),
                functionID = queryGrouped.Key.functionID,
                recordGroup = queryGrouped.Key.recordGroup,
                clerkID = queryGrouped.Key.clerkID,
                date = queryGrouped.Min(c => c.ap.date),
                errorLevel = (queryGrouped.Max(c => c.ap.errorLevel) == null || !queryGrouped.Max(c => c.ap.errorLevel).HasValue ? 0 : queryGrouped.Max(c => c.ap.errorLevel)),
                severity = queryGrouped.Max(c => c.ap.severity)
            };            

        if (errorLevel != -1)
            items = items.Where(column => column.errorLevel >= errorLevel);

        var _items =
            from subSelect in items
            join alf in objDataContext.appLogFunctions on
                new { functionID = subSelect.functionID.Value } equals new { functionID = alf.functionID }
            join alft in objDataContext.appLogFunctionTexts on
                new { alf.functionID, language } equals new { alft.functionID, alft.language }
            join ale in objDataContext.appLogErrorLevels on
                new { errorLevel = subSelect.errorLevel.Value } equals new { errorLevel = ale.errorLevelID }
            join alet in objDataContext.appLogErrorLevelTexts on
                new { errorLevelID = subSelect.errorLevel.Value, language } equals new { alet.errorLevelID, alet.language }
            join als in objDataContext.appLogSeverities on
                new { severity = subSelect.severity.Value } equals new { severity = als.severityID }
            join alst in objDataContext.appLogSeverityTexts on
                new { als.severityID, language } equals new { alst.severityID, alst.language }
            select new Model_AppLog()
            {
                sequence = subSelect.sequence,
                functionID = subSelect.functionID,
                recordGroup = subSelect.recordGroup,
                clerkID = subSelect.clerkID,
                date = subSelect.date,
                errorLevel = subSelect.errorLevel,
                severity = subSelect.severity,
                functionDescription = alft.denotation,
                errorLevelDescription = alet.denotation,
                severityDescription = alst.denotation
            };                     

        //Apply filters
        if (filterDescriptors != null && filterDescriptors.Any())
        {
            _items = _items.Where(ExpressionBuilder.Expression<Model_AppLog>(filterDescriptors));
        }

        if (functionID != -1)            
            _items = _items.Where(column => column.functionID == functionID);                              

        //Apply sorting        
        if (sortDescriptors != null)
        {
            GlobalMethods objGlobalMethods = new GlobalMethods();
            orderString = objGlobalMethods.GetOrderString(sortDescriptors);
        }

        //Apply ordering
        if (orderString != string.Empty)            
            _items = _items.OrderBy(orderString);            
        else            
            _items = _items.OrderByDescending(x => x.date);            

        //Set total number of rows
        numRows = _items.AsEnumerable<Model_AppLog>().Count();            

        //Get paginated results
        _items = _items.Skip(pageSize * (numPage - 1)).Take(pageSize);            

        //Set data result            
        rows = _items;
    }

1 ответ

Вот статья о производительности EF: MSDN

Самая важная вещь, которую вы можете сделать, чтобы улучшить время запуска, - это предварительно скомпилировать ваши представления (в конце статьи MSDN есть раздел)

Если вы сначала используете базу данных, есть шаблон T4 here ты можешь использовать.

Если вы используете код в первую очередь, есть проект here хотя сам не пробовал.


Примечание: когда вы обновляете свой проект с.NET 4.0 до.NET 4.5, вам нужно удалить пакет EF NuGet и переустановить его - существуют разные версии EF 5 для разных сред выполнения.

Другие вопросы по тегам