如何根据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。