MongoDB C# 中的 FilterDefinition 和接口

MongoDB FilterDefinition and interfaces in C#

我有一个 MongoDB 集合包含具有相同接口的不同实体 IDocument

public class BarDocument: IDocument
{
    public string BarField { get; set; }
}

现在我需要在这个集合中找到这样的东西:

var fooDoc = new FooDocument() { FooField = "test Foo Field" };
var barDoc = new BarDocument() { BarField = "test Bar Field" };
var barDoc1 = new BarDocument() { BarField = "test Bar Field 2" };

await _documentsCollection.InsertManyAsync(new List<IDocument>() { fooDoc, barDoc, barDoc1 });



var filterBar = Builders<BarDocument>.Filter.Where(x => x.BarField.Contains("Bar")) ;

var result = await _documentsCollection.Find(filterBar).ToListAsync();

但是这个Find语句以编译错误结束:

Error   CS1503  Argument 2: cannot convert from 'MongoDB.Driver.FilterDefinition<WebApi.Models.Entities.Documents.BarDocument>' to 'System.Linq.Expressions.Expression<System.Func<WebApi.Models.Entities.Documents.IDocument, bool>>'

有人可以给我提示吗?

_documentsCollection 变量定义为 ICollection<IDocument>>,因此您可以插入同时定义为 FooDocumentBarDocument 的文档并且它有效 - MongoDB 知道如何将它们存储在一个集合中并保留它们的原始类型(_t 字段)。

将它们插入同一个集合后,您将尝试使用在派生类型上定义的过滤器查询 ICollection<IDocument>>,编译器不允许这样做,因为 BarField 不为 IDocument

您可以定义另一个专门针对 BarDocument 的变量,然后 运行 您对此类集合的查询:

var barCollection = database.GetCollection<BarDocument>("yourcol");
var filterBar = Builders<BarDocument>.Filter.
                                     Where(x => x.BarField.Contains("Bar"));

var result = await barCollection.Find(filterBar).ToListAsync();

只要您的查询 returns 只有 BarDocument class.

的实例,这应该有效