项目

本文档有多个版本。请选择最适合您的选项。

UI
Database

Web 应用开发教程 - 第 7 部分:作者:数据库集成

简介

本部分介绍如何为上一部分引入的 Author 实体配置数据库集成。

DB 上下文

打开 Acme.BookStore.MongoDB 项目 MongoDb 文件夹中的 BookStoreMongoDbContext,并向类中添加以下属性:

public IMongoCollection<Author> Authors => Collection<Author>();

实现 IAuthorRepository 接口

Acme.BookStore.MongoDB 项目(Authors 文件夹内)中创建一个新类,命名为 MongoDbAuthorRepository,并粘贴以下代码:

using System;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Collections.Generic;
using System.Threading.Tasks;
using Acme.BookStore.MongoDB;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using Volo.Abp.Domain.Repositories.MongoDB;
using Volo.Abp.MongoDB;

namespace Acme.BookStore.Authors;

public class MongoDbAuthorRepository
    : MongoDbRepository<BookStoreMongoDbContext, Author, Guid>,
    IAuthorRepository
{
    public MongoDbAuthorRepository(
        IMongoDbContextProvider<BookStoreMongoDbContext> dbContextProvider
        ) : base(dbContextProvider)
    {
    }

    public async Task<Author> FindByNameAsync(string name)
    {
        var queryable = await GetQueryableAsync();
        return await queryable.FirstOrDefaultAsync(author => author.Name == name);
    }

    public async Task<List<Author>> GetListAsync(
        int skipCount,
        int maxResultCount,
        string sorting,
        string filter = null)
    {
        var queryable = await GetQueryableAsync();
        return await queryable
            .WhereIf<Author, IQueryable<Author>>(
                !filter.IsNullOrWhiteSpace(),
                author => author.Name.Contains(filter)
            )
            .OrderBy(sorting)
            .Skip(skipCount)
            .Take(maxResultCount)
            .ToListAsync();
    }
}
  • 继承自 MongoDbRepository,因此继承了标准仓储方法的实现。
  • WhereIf 是 ABP 的一个快捷扩展方法。仅当满足第一个条件时(仅当提供了过滤器时按名称过滤),它才添加 Where 条件。你也可以自己实现,但这类快捷方法能让我们的工作更轻松。
  • sorting 可以是像 NameName ASCName DESC 这样的字符串。这是通过使用 System.Linq.Dynamic.Core NuGet 包实现的。

有关基于 MongoDB 的仓储的更多信息,请参阅 MongoDB 集成文档


在本文档中