как улучшить холодный запрос помимо скомпилированного запроса - PullRequest
0 голосов
/ 15 января 2019

В моем хранилище есть API-интерфейс Find, и скомпилированный запрос не работает должным образом. В запросе есть несколько IEnumerable.Contains (), поэтому результатом компиляции является SQL без оператора where-in и все содержимое оценивается локально.

Я знаю, что Entity Framework 6 поддерживает предварительную генерацию представления, имеет ли ядро ​​Entity Framework аналогичную концепцию? Если нет, какой следующий прием можно использовать для повышения производительности холодных запросов?

[Update] Это только для иллюстрации

var typeIds = new int[] { 1, 2 };
var allTypeIds = !typeIds.Any();
var subTypeIds = new int[0];
var allSubTypeIds = !subTypeIds.Any();
var navEntityIds = new int[0];
var allNavEntityIds = !navEntityIds.Any();

var result = dbContext.Entities.Where(e =>
    (allTypeIds || typeIds.Contains(e.TypeId))
    && (allSubTypeIds || subTypeIds.Contains(e.SubTypeId))
    && (allNavEntityIds || navEntityIds.Contains(e.NavigationEntityId)))
    .Include(e => e.Type)
    .Include(e => e.SubType)
    .Include(e => e.NavigationEntity)
    .Include(e => e.ExtendedEntities)
    .ToList();

[Update2] Скомпилированная версия

var searchParam = new SearchParam();
searchParam.TypeIds = new int[] { 1, 2 };
searchParam.AllTypeIds = !searchParam.TypeIds.Any();
searchParam.SubTypeIds = new int[0];
searchParam.AllSubTypeIds = !searchParam.SubTypeIds.Any();
searchParam.NavEntityIds = new int[0];
searchParam.AllNavEntityIds = !searchParam.NavEntityIds.Any();

var compiledQuery = EF.CompileQuery<MyDbContext, SearchParam, Entity>((ctx, sp) =>
    ctx.Entities.Where(e =>
        (sp.AllTypeIds || sp.TypeIds.Contains(e.TypeId))
        && (sp.AllSubTypeIds || sp.SubTypeIds.Contains(e.SubTypeId))
        && (sp.AllNavEntityIds || sp.NavEntityIds.Contains(e.NavigationEntityId)))
        .Include(e => e.Type)
        .Include(e => e.SubType)
        .Include(e => e.NavigationEntity)
        .Include(e => e.ExtendedEntities));
var result = compiledQuery.Invoke(dbContext, searchParam)
    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...