我在
Card
实体上编写了一个存储库:
public class CardRepository : Repository, ICardRepository
{
public CardRepository(EntityContext context) : base(context)
{
}
public async Task AddCardAsync(Card card,CancellationToken cancellationToken=default)
=> await _context.Cards.AddAsync(card,cancellationToken);
public IQueryable<Card> GetCardQuery(bool asNoTracking = true)
=> asNoTracking ? _context.Set<Card>().AsNoTracking() : _context.Set<Card>();
public async Task<Card?> GetCardAsync(CancellationToken cancellationToken = default,
bool asNoTracking = true,
Expression<Func<Card, bool>>? predicate = null,
ICollection<KeyValuePair<SortType,Expression<Func<Card,object>>>> orders = null,
ICollection<Expression<Func<Card,object>>> includes = null)
{
var query = _context.Set<Card>().AsQueryable();
if (asNoTracking)
query = query.AsNoTracking();
if (predicate != null)
query = query.Where(predicate);
if (orders != null && orders.Any())
foreach (var order in orders)
query = order.Key == SortType.AES ? query.OrderBy(order.Value) : query.OrderByDescending(order.Value);
if (includes != null && includes.Any())
foreach (var include in includes)
query = query.Include(include);
return await query.FirstOrDefaultAsync(cancellationToken);
}
}
我对存储库模式有一些疑问
我有一个返回
IQueryable<Card>
的方法,存储库应该返回IQueryable
吗?我如何知道其他开发者正在使用 AddCardAsync
方法而不是使用 GetCardQuery
并添加 Card
进行查询?
如果我删除
GetCardQuery
并写入 GetCardAsync
需要获取一些参数:在这种方法中,我的问题是 includes
,因为此参数可以包含相关实体的一级。我可以获取 n 级包含的 Include
和 ThenInclude
的字符串(实体名称)列表,但我想通过 Expression<Func<Card,object>>
获取 n 级包含,我该怎么做?
如果你在谷歌上做了一些调查,你应该会遇到很多存储库模式实现的例子,我只是添加其中的一些。