Entity Framework Core: AsSplitQuery со сложными фильтрами не возвращает определенные свойства навигации при использованиC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Entity Framework Core: AsSplitQuery со сложными фильтрами не возвращает определенные свойства навигации при использовани

Сообщение Anonymous »

У нас есть сложный запрос к сущности под названием Image. У этой сущности много свойств навигации, и мы используем AsSplitQuery, потому что здесь много изображений, много таблиц и AsNoTracking.
Запрос строится следующим образом:

Код: Выделить всё

var query = entity1Repository.Include(x => x.Entity2)
.ThenInclude(x => x.Entity3)
.Include(x => ...)
[...]
.AsNoTracking()
.AsSplitQuery();

if ([condition])
{
query = query.Where(x => ... );
}
if([condition])
{
// There is this kind of case with order by in the query
query = query.Where(x => x.Entity2.OrderBy(x => x.CreationDate).FirstOrDefault().Prop == search.Prop.Value);
}
// [more filters]

// Navigation property value for entity2 exist
var image = await query.SingleAsync(x => x.Id == 1234);

// Navigation property value for entity2 missing for some entity1
var result = await query.ToListAsync();
Когда запрос инициируется с помощью ToListAsync(), некоторые значения свойств навигации отсутствуют в некоторых объектах (не во всех).
При использовании .Single(x => x.Id == ...) свойства навигации загружаются корректно.
Без AsSplitQuery запрос работает нормально, если запрашивается мало данных, иначе время ожидания истекает, и мы не можем их удалить.
Я использую EF Core 7.0.20, SQL Server и ASP.NET Core 6. .
Конфигурация объекта работает нормально, вот уже год ничего не сообщается.
Вопрос: Что может быть источник такого поведения?
== EDIT ==
После многих попыток мы нашли обходной путь, который кажется чтобы работало нормально (еще нужно адаптироваться)
Проецируем объект в промежуточный класс (мы назвали его проекцией):

Код: Выделить всё

public class entityProjection {
public int entity1Id {get;set;}
public int entity2Id {get;set;}
public string entity1Property {get;set;}
public string entity2Property {get;set;}
public Entity2PropertyClassProjection entity2ClassProperty {get;set;}
}
Тогда с предыдущим запросом:

Код: Выделить всё

query = query.Select(x => new entityProjection(){
entityId1 = x.Id,
entityId2 = x.entity2.Id,
entity1Property = x.property1,
entity2Property = x.property2,
// For sub navigation properties
entity2PropertyClass = new Entity2PropertyClassProjection{
classProp1 = x.entity2.ClassProperty.classProp1,
classProp2 = x.entity2.ClassProperty.classProp2,
[...]
}
});
Это упростит построение запроса в дальнейшем, что является хорошим подспорьем для этого обходного пути. Но это не ответ на вопрос, почему ToList() не дает тот же результат, что и Single();

Подробнее здесь: https://stackoverflow.com/questions/791 ... urn-specif
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»