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>>
,因此您可以插入同时定义为 FooDocument
和 BarDocument
的文档并且它有效 - 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.
的实例,这应该有效
我有一个 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>>
,因此您可以插入同时定义为 FooDocument
和 BarDocument
的文档并且它有效 - 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.