MongoDB C# GetById 使用 Find

Jos*_*hua 4 .net c# mongodb-.net-driver

public abstract class GenericRepository<T> : IDisposable, IGenericRepository<T> where T : class
{
    protected SphereTripMongoDbContext SphereTripMongoDbContext;
    public IMongoCollection<T> MongoCollection { get; set; }
    protected GenericRepository(SphereTripMongoDbContext sphereTripMongoDbContext)
    {
        SphereTripMongoDbContext = sphereTripMongoDbContext;
        MongoCollection =
            SphereTripMongoDbContext.MongoDatabase.GetCollection<T>(typeof(T).Name);
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }

    public T GetById(string id)
    {
        var entity = MongoCollection**.Find(t => t.Id == id)**;
        return entity;
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试为 MongoDb 编写一个通用的抽象存储库类。由于我在基类中使用通用类型,因此在使用Find方法查找文档时“Id”不可见。不知道如何解决这个问题。

任何帮助,将不胜感激。

i3a*_*non 6

您可以在Find不使用类型化 lambda 表达式的情况下使用Builders

 var item = await collection
    .Find(Builders<ItemClass>.Filter.Eq("_id", id))
    .FirstOrDefaultAsync();
Run Code Online (Sandbox Code Playgroud)

但是,更强大的解决方案是使用一些接口来提供您需要的东西(即 ID),并确保GenericRepository仅适用于这些类型:

interface IIdentifiable
{
    string Id { get; }
}

class GenericRepository <T> : ... where T : IIdentifiable
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • @Joshua 如果泛型参数实现了接口,那么它有一个 ID 属性,您可以使用它来构建过滤器。 (2认同)