如何根据MongoDB和C#中特定列表包含的可空属性查找?

如何根据MongoDB和C#中特定列表包含的可空属性查找?,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,我有一个Cage对象,它包含一个可空的属性Guid?PetId现在我想更新PetId在列表中的所有笼子PetId 我尝试将PetId转换为List或尝试x=>x.PetId!=无效的PetId:Guid.Empty在查询表达式中的中,但不起作用 这是我的方法: public async Task<bool> MyMethodAsync(IEnumerable<Guid> petIds) { var query = Builders<Cage>.Filte

我有一个
Cage
对象,它包含一个可空的属性
Guid?PetId
现在我想更新
PetId
列表中的所有笼子
PetId

我尝试将
PetId
转换为
List
或尝试
x=>x.PetId!=无效的PetId:Guid.Empty
在查询表达式中的
中,但不起作用

这是我的方法:

public async Task<bool> MyMethodAsync(IEnumerable<Guid> petIds)
{
   var query = Builders<Cage>.Filter.In(x => x.PetId.Value, petIds);
   var updateQuery = Builders<Cage>.Update.Set(x => x.PetId, null);
   var result = await Collection.UpdateManyAsync(query, updateQuery);
   return result.IsAcknowledged;
}
公共异步任务MyMethodAsync(IEnumerable PetID) { var query=Builders.Filter.In(x=>x.PetId.Value,petIds); var updateQuery=Builders.Update.Set(x=>x.PetId,null); var result=await Collection.updatemanayasync(查询,updateQuery); 返回结果。已确认; }

我得到的只是这个错误
无法确定x=>x.PetId.Value的序列化信息

简单地使用
Guid.Empty
而不是null如何?i、 e.必须将PetID存储为Guid,并且在类声明中具有默认值Guid.Empty

下面是一个演示:

使用系统;
使用MongoDB.Entities;
命名空间堆栈溢出
{
公共课程
{
公共类框架:实体
{
公共Guid PetID{get;set;}=Guid.Empty;
}
静态void Main(字符串[]参数)
{
新DB(“测试”);
var cage1=new Cage{PetID=Guid.NewGuid()};
cage1.Save();
var cage2=新的Cage{};
2.保存();
var list=new[]{cage1.PetID,Guid.NewGuid(),Guid.NewGuid()};
DB.Update()
.Match(f=>f.In(c=>c.PetID,list))
.Modify(c=>c.PetID,Guid.Empty)
.Execute();
}
}
}

上面的代码使用的是一个方便的c#驱动程序库。[免责声明:我是该库的作者]

简单地使用
Guid.Empty
而不是null怎么样?i、 e.必须将PetID存储为Guid,并且在类声明中具有默认值Guid.Empty

下面是一个演示:

使用系统;
使用MongoDB.Entities;
命名空间堆栈溢出
{
公共课程
{
公共类框架:实体
{
公共Guid PetID{get;set;}=Guid.Empty;
}
静态void Main(字符串[]参数)
{
新DB(“测试”);
var cage1=new Cage{PetID=Guid.NewGuid()};
cage1.Save();
var cage2=新的Cage{};
2.保存();
var list=new[]{cage1.PetID,Guid.NewGuid(),Guid.NewGuid()};
DB.Update()
.Match(f=>f.In(c=>c.PetID,list))
.Modify(c=>c.PetID,Guid.Empty)
.Execute();
}
}
}

上面的代码使用的是一个方便的c#驱动程序库。[免责声明:我是该库的作者]

我可以通过将
petIds
更改为
IEnumerable
并将
query
部分更改为
Builders.Filter.In(x=>x.PetId,petIds)
来解决这个问题,但是有没有更好的方法呢?您可以在Filter语句中像
Builders.Filter.In一样强制转换它(x=>x.PetId.Value,petIds.Select(p=>(Guid?)p);
谢谢@Skami,但是MongoDB不能序列化
x.PetId.Value
,所以你会得到同样的错误。你是正确的,但不会
Builders.Filter.In(x=>x.PetId,petIds.Select(x=>(Guid?)x))
够了吗?谢谢,是的,它是正确的,但基本上是相同的代码。将
PetId
转换为
Guid?
。我可以通过将
PetId
更改为
IEnumerable
,并将
部分查询为
Builders.Filter.In(x=>x.PetId,petIds)来解决这个问题
但是有更好的方法吗?你可以在filter语句中像
Builders.filter.in(x=>x.PetId.Value,petIds.Select(p=>(Guid?)p);
谢谢@Skami,但是MongoDB不能序列化
x.PetId.Value
,所以你会得到同样的错误。你是正确的,但不会
Builders.filter.in(x=>x.PetId,petIds.Select(x=>(Guid?.x));
足够了吗?谢谢,是的,但它基本上是相同的代码。将
PetId
转换为
Guid?
。谢谢,这是我的第一个方法,但后来我需要将其更改为null-able。谢谢,这是我的第一个方法,但后来我需要将其更改为null-able。