如何使用mongoDb c#驱动程序通过组合两个或多个字段的表达式进行过滤/排序

如何使用mongoDb c#驱动程序通过组合两个或多个字段的表达式进行过滤/排序,c#,mongodb,C#,Mongodb,假设我的模型是这样的: public abstract class BaseModel { public DateTime CreatedDT { get; set; } public DateTime? ModifiedDT { get; set; } } public class Model : BaseModel { //more properties here } 我想要为MongoDb驱动程序编写与此Linq查询等效的查询: var collection =

假设我的模型是这样的:

public abstract class BaseModel
{
    public DateTime CreatedDT { get; set; }
    public DateTime? ModifiedDT { get; set; }
}

public class Model : BaseModel
{
   //more properties here
}
我想要为MongoDb驱动程序编写与此Linq查询等效的查询:

var collection = database.GetCollection<Model>("CollectionName");
var result = await collection.Find(FilterDefinition<Model>.Empty).ToListAsync();
result.Where(m => m.ModifiedDT ?? m.CreatedDT > someDate).OrderBy(m => m.ModifiedDT ?? m.CreatedDT).ToList();
            
var collection=database.GetCollection(“CollectionName”);
var result=await collection.Find(FilterDefinition.Empty).toListSync();
result.Where(m=>m.ModifiedDT??m.CreatedDT>someDate).OrderBy(m=>m.ModifiedDT??m.CreatedDT).ToList();
我试过这个:

var collection = database.GetCollection<Model>("CollectionName");
var result = await collection.Find(x => m.ModifiedDT ?? m.CreatedDT > someDate)
                .SortBy(m => m.ModifiedDT ?? m.CreatedDT)
                .ToListAsync();
var collection=database.GetCollection(“CollectionName”);
var result=await collection.Find(x=>m.ModifiedDT??m.CreatedDT>someDate)
.SortBy(m=>m.ModifiedDT×m.CreatedDT)
.ToListAsync();
但我得到:

System.InvalidOperationException:无法确定 m=>Convert((m.ModifiedDT?? m、 CreatedDT),对象)


对于这种查询,您需要一个聚合查询来选择一个字段或另一个字段,因为该字段为null。这个操作符是,我们可以使用stage将其附加到文档中

我在下面给出了一个小例子,说明如何在C#中实现这一点,目前在驱动程序中不支持添加字段的流畅方法,因此我们需要使用
AppendStage

var client=newmongoclient();
var db=client.GetDatabase(“db”);
var collection=db.GetCollection(“订单”);
//首先清理数据库。
wait db.DropCollectionAsync(collection.CollectionNamespace.CollectionName);
var date=DateTime.UtcNow.AddMinutes(-1);
//在某些ModifiedDT为空的位置添加一些数据
wait collection.InsertManyAsync(新[]
{
新订单{Name=“1”,CreatedDT=DateTime.UtcNow.AddMinutes(1),ModifiedDT=null},
新订单{Name=“2”,CreatedDT=date,ModifiedDT=DateTime.UtcNow.AddMinutes(2)},
新订单{Name=“3”,CreatedDT=DateTime.UtcNow.AddMinutes(3),ModifiedDT=null},
新订单{Name=“4”,CreatedDT=date,ModifiedDT=DateTime.UtcNow.AddMinutes(4)},
新订单{Name=“5”,CreatedDT=DateTime.UtcNow.AddMinutes(5),ModifiedDT=null},
新订单{Name=“6”,CreatedDT=date,ModifiedDT=DateTime.UtcNow.AddMinutes(6)},
});
var someDate=DateTime.UtcNow.AddDays(-10);
var orders=collection.Aggregate()
//添加聚合阶段以向LastModified的文档添加一个额外字段,该字段可以是ModifiedDT,但如果为null$CreatedDT
.附属物阶段(
@{$addFields:{LastModified:{$ifNull:[“$ModifiedTT”,“$CreatedDT”“]}}”)
//当新字段大于给定日期时匹配。
.Match(x=>x.LastModified>someDate)
//按我们的新字段排序
.SortBy(x=>x.LastModified)
//删除我们添加的字段,这样我们就不会将其传输回导线
.AppendStage(@“{$unset:“LastModified”“}”)
//执行聚合查询
.ToList();
foreach(订单中的var订单)
{
Console.WriteLine($“Name:{order.Name}”);
}
//姓名:1
//姓名:2
//姓名:3
//姓名:4
//姓名:5
//姓名:6
内部类顺序
{
公共对象Id{get;set;}
公共字符串名称{get;set;}
public DateTime CreatedDT{get;set;}
公共日期时间?ModifiedDT{get;set;}
}
内部类顺序投影
{
公共对象Id{get;set;}
公共字符串名称{get;set;}
public DateTime CreatedDT{get;set;}
公共日期时间LastModified{get;set;}
公共日期时间?ModifiedDT{get;set;}
}

你好,凯文,谢谢你的回答。不过我有两个问题。首先,我不能使用“$unset”,因为我使用的驱动程序版本显然不支持它(我坚持使用版本2.10.3,无法更改)。虽然我想我可以接受,所以我尝试删除它,但预期的排序顺序不起作用。它被完全忽略了(在我的问题中检查更新的代码)@CristianGrisolia您使用的MongoDB引擎的版本是什么?我使用的是AWS DocumentDb:docdb 3.6.0您能给我展示一下您在MongoDB中的一些文档的示例吗
db.collection.find()
在shellSure中,检查上面更新的问题谢谢,看起来问题可能是
CreatedDT
ModifiedDT
上的大小写,它们需要是
CreatedDT
ModifiedDT
。试着在addFields阶段改变一下。是的,谢谢Kevin。我才意识到。我会尽快尝试,并在这里更新反馈…@KevinSmith,一旦我更换外壳,它就起作用了。现在唯一缺少的部分是我原始问题中关于过滤器的部分(LastChanged>somedate)。我还没弄明白。谢谢