Я использую C # 8, стандарт .net 2.0 с MongoDB.Driver v2.9.2. Я перевожу проект из RavenDB в MongoDB.
Мне нужно как-то использовать include с IMongoQueryable в моем методе GetAllAsync, но я запутался. Вот метод;
public async Task<ICollection<TEntity>> GetAllAsync<TOrderBy>(Expression<Func<TEntity, TOrderBy>> orderBy,
bool isDescendingOrder = false,
Expression<Func<TEntity, object>> projection = null,
CancellationToken cancellationToken = default)
{
IMongoQueryable<TEntity> mongoQueryable = Collection.AsQueryable();
if (isDescendingOrder)
{
return await mongoQueryable.OrderByDescending(orderBy)
.ToListAsync(cancellationToken: cancellationToken);
}
return await mongoQueryable.OrderBy(orderBy)
.ToListAsync(cancellationToken: cancellationToken);
}
То, что я пробовал до сих пор;Я могу построить тот же запрос с помощью метода «Find ()», но метод SortByDescending требует «Expression<Func<TEntity, object>> orderBy
» - не может работать с Expression<Func<TEntity, TOrderBy>> orderBy
, как блок верхнего кода, который я предоставил.
Builders<TEntity>.Sort.Ascending(orderBy).
Func<TEntity, TOrderBy> compile = orderBy.Compile();
Collection.Find(new BsonDocument()).Project(projection).SortByDescending(compile).ToListAsync();
И последнеевот что я решил в RavenDB:
public async Task<ICollection<TEntity>> GetAllAsync<TOrderBy>(Expression<Func<TEntity, TOrderBy>> orderBy,
bool isDescendingOrder = false,
Expression<Func<TEntity, object>> projection = null,
CancellationToken cancellationToken = default)
{
ICollection<TEntity> entities;
IRavenQueryable<TEntity> query = AsyncDocumentSession.Query<TEntity>();
if (projection != null)
{
query = query.Include(projection);
}
if (isDescendingOrder)
{
entities = await query.OrderByDescending(orderBy)
.ToListAsync(token: cancellationToken);
}
else
{
entities = await query.OrderBy(orderBy)
.ToListAsync(token: cancellationToken);
}
return entities;
}