如何在MongoDB C#驱动程序中按子体属性进行过滤?

如何在MongoDB C#驱动程序中按子体属性进行过滤?,c#,mongodb,inheritance,C#,Mongodb,Inheritance,假设我有一个从Vehicle开始的类层次结构,有Car,Plane e.t.c.我想检索最后32辆车,但我不想看到特殊类型的车,例如冬季轮胎上的车。这辆汽车在野外很疲劳。 这应该是一个简单的mongo查询,如下所示: db.Vehicles.find({ "userId" : ObjectId("5df1f2d1de064e5618be579c"), "tireType": {$ne: "Winter"}, }).sort({ "_id" : -1 }).limit(32) 但

假设我有一个从Vehicle开始的类层次结构,有Car,Plane e.t.c.我想检索最后32辆车,但我不想看到特殊类型的车,例如冬季轮胎上的车。这辆汽车在野外很疲劳。 这应该是一个简单的mongo查询,如下所示:

db.Vehicles.find({
    "userId" : ObjectId("5df1f2d1de064e5618be579c"),
    "tireType": {$ne: "Winter"},
}).sort({ "_id" : -1 }).limit(32)
但在C#中我能做些什么来实现这一点呢?我尝试了很多不同的方法,比如LINQ(不支持):

FilterBuilder(无法转换):

使用V=Builders;
使用C=生成器;
_db.车辆
.Find(V.Filter.And(C.Filter.Ne(x=>x.TireType,“冬季”),V.Filter.Eq(x=>x.UserId,UserId))
.SortByDescending(x=>x.Id)
.限额(32);
我可以用BsonDocument实现这一点,但我希望它具体化到模型类中…找不到一个很好的答案…

尝试一下:

var车辆=收集。查找(
Builders.Filter.Eq(v=>v.UserID,“xxx”)&
Builders.Filter.Ne(“TireType”、“winter”))
.SortByDescending(v=>v.Id)
.限额(32)
.ToList();
下面是一个测试程序:

使用MongoDB.Entities;
使用MongoDB.Entities.Core;
命名空间堆栈溢出
{
[名称(“车辆”)]
公共类车辆:实体
{
公共字符串类型{get;set;}
公共字符串用户标识{get;set;}
公共字符串颜色{get;set;}
}
[名称(“车辆”)]
公营车辆
{
公共字符串类型{get;set;}
}
[名称(“车辆”)]
公营货车
{
公共字符串类型{get;set;}
}
公共课程
{
私有静态void Main(字符串[]args)
{
新数据库(“测试”、“本地主机”);
(新车{UserID=“xxx”,Type=“Car”,Color=“red”,TireType=“summer”});
(新车{UserID=“xxx”,Type=“Car”,Color=“white”,TireType=“winter”});
(新卡车{UserID=“xxx”,Type=“Truck”,Color=“black”,FuelType=“diesel”});
var result=DB.Find()
.Match(f=>
f、 Eq(v=>v.UserID,“xxx”)&
f、 Ne(“疲劳”、“冬天”))
.Sort(v=>v.ID,Order.Descending)
.限额(32)
.Execute();
//var result=DB.Collection().Find(
//Builders.Filter.Eq(v=>v.UserID,“xxx”)&
//Builders.Filter.Ne(“TireType”、“winter”))
//.限额(32)
//.ToList();
}
}
}
from v in _db.Vehicles.AsQueryable()
where v.UserId == userId
let c = v as Car
where c == null || c.TireType != "Winter"
orderby ev.Id descending
select v;
using V = Builders<Vehicle>;
using C = Builders<Car>;

_db.Vehicles
.Find(V.Filter.And(C.Filter.Ne(x=>x.TireType, "Winter"), V.Filter.Eq(x=>x.UserId, userId))
.SortByDescending(x => x.Id)
.Limit(32);