C#MongoDB,LINQ无法按Id匹配



我正在使用MongoDB驱动程序(2.12.4(,同时试图远离Bson文档。除了Mongo收集方法之外,我所有的查询都使用LINQ。

我有一个像这样的基类:

public abstract class Entity
{
public Guid Id { get; protected set; }
}

像这样的子类:

public class User : Entity
{
public string Name { get; set; }
public string Email { get; set; }
}
public User(string name = "", string email = "")
{
Id = Guid.NewGuid();
Name = name;
Email = email;
}

我的数据库类初始化如下:

class Database
{
const string MongoConnection = "mongodb+srv://user:password@cluster0.mongodb.net/";
public static MongoClient Client { get; private set; }
public static IMongoDatabase Directory { get; private set; }
public static IMongoCollection<User> Users { get; private set; }
public Database()
{
BsonSerializer.RegisterSerializer(new GuidSerializer(GuidRepresentation.Standard));
Client = new MongoClient(MongoConnection);
Directory = Client.GetDatabase("DB");
Users = Directory.GetCollection<User>("users");
}
}

到目前为止行之有效的方法:

Database.Users.InsertOne((new User("name", "email@domain.com")); //cloud.mongodb.com shows {_id : UUID('a12937ba-7a7c-4c5d-a8ff-4049e9878ca3')}
var document = Database.Users.AsQueryable().Where(x => x.Email == "email@domain.com").FirstOrDefault();
Database.Users.AsQueryable().ToList().Where(x => x.Id == document.Id).FirstOrDefault()

但以下都不起作用:

Database.Users.Find(x => x.Id == document.Id).FirstOrDefault(); //returns null
Database.Users.AsQueryable().Any(x => x.Id == document.Id); //returns false
Database.Users.ReplaceOne(x => x.Id == document.Id, document); //returns MatchedCount = 0

因此,似乎只要我使用.ToList,一切都会按预期进行。但是,如果我直接在集合上使用.AsQueryable、.Find、.Any或.ReplaceOne,那么它就无法在Id之间执行匹配。

我找不到一个不使用[BsonId]或[BsonElement]并且不使用过滤器和生成器的类似问题。如果我理解正确的话,MongoDB驱动程序应该自动进行映射,除了Id之外,它对每个属性都有效。我缺少什么?

PS:我没有使用实体框架

您需要在应用程序启动时添加以下内容:

BsonDefaults.GuidRepresentation = GuidRepresentation.Standard;

这使得使用Guid Id进行查询成为可能。它确实有一个评论";过时的";关于最新的驱动程序,但我想这是个错误。

最新更新