Я перенес концепции из пары фреймворков CQRS, которые я видел, и только что столкнулся с некоторыми проблемами. домена приложения, скорее я предоставляю интерфейсы, IReadEntities и IWriteEntities, которые имеют такие методы, как Query () и Get (), которые за кулисами вызывают Set (), возвращая DbSet (), а затем позволяя связывать стандартные выражения LINQ, как для любых EF запрос. У меня проблемы с использованием Include () в моих IQueryables, поскольку я использую LinqKit с AsExpandable () в конце всех своих вызовов. Вот как выглядят мои методы контекстного запроса.
public new IQueryable<TEntity> Query<TEntity>() where TEntity : class, IEntity
{
// AsNoTracking returns entities that are not attached to the DbContext
return QueryUnfiltered<TEntity>().Where(_recordAuthority.Clause<TEntity>());
}
public IQueryable<TEntity> QueryUnfiltered<TEntity>() where TEntity : class, IEntity
{
// AsNoTracking returns entities that are not attached to the DbContext
return Set<TEntity>().AsNoTracking().AsExpandable();
}
Типичный обработчик запросов выглядит следующим образом:
public async Task<IEnumerable<GetCustomerView>> Handle(CustomersBy query, CancellationToken cancellationToken)
{
var customers = _db.Query<Customer>();
// Apply filters
if (!string.IsNullOrEmpty(query.FirstName))
customers = customers.Where(x => x.FirstName.Contains(query.FirstName));
if (!string.IsNullOrEmpty(query.LastName))
customers = customers.Where(x => x.LastName.Contains(query.LastName));
// Execute the query and return the results
var view = await customers.Select(x => new GetCustomerView
{
Id = x.Id,
FirstName = x.FirstName,
LastName = x.LastName,
EmailAddress = x.EmailAddress
}).ToListAsync(cancellationToken).ConfigureAwait(false) as IEnumerable<GetCustomerView>;
return view;
}
Этот сценарий отлично работает, если я хочу получить информацию об адресе из связанной таблицы поскольку я использую проекцию на сервере базы данных, учитывая, что я использую Select перед выполнением. Есть сценарий ios, хотя имеет смысл вернуть граф объекта и указать операторы Include (...), но в его нынешнем виде указание _db.Query<Customer>().Include(c => c.Address)
не гидратирует свойство навигации по адресу. Я попытался отключить AsExpandable (), а затем результаты вернутся.
Вопрос в том, видит ли кто-нибудь способ разрешить предоставление операторов Include, возможно, в качестве параметра метода, а затем я l oop через них и прикрепить их перед вызовом AsExpandable ()? Я не могу понять, как это сделать, если это возможно.
Может быть, есть другой подход?
Интересно, что это, по-видимому, отлично работает с версией этого шаблона, которую использует коллега, где они используют EF 6. Он говорит, что они без проблем указывают Include после AsExpandable.