Проверка установки 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 для разных сред выполнения.