В моем хранилище есть 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();