-1 in the index of a list in C#(在-1\f25 C#-1\f6列表的索引中)
问题描述
我最近在我们的应用程序中遇到了以下代码段
var updateDefinition = new UpdateDefinitionBuilder<OverviewProfile>()
.Set(a => a.Advisors[-1].IsCurrent, advisor.IsCurrent);
在上面的代码中,Advisors
是List
,UpdateDefinitionBuilder
来自MongoDB驱动。
您能告诉我列表索引中-1的用法吗?
在以下评论/答案后编辑
OverviewProfile
类如下:
public class OverviewProfile: BaseInvestorProfile
{
//Other properties
public List<Advisor.View.Advisor> Advisors { get; set; }
public OverviewProfile(int id): base(id)
{
Advisors = new List<Advisor.View.Advisor>();
}
}
这就是工作代码。此代码根据条件将数据更新到mongo数据库。此类中没有其他方法,只有其他属性。
这是一个类,但多个类的属性也有相同的用法,即使我们添加新的List
属性并进行检查,它也工作得很好。
推荐答案
您正在使用预期Expression
的UpdateDefinitionBuilder<T>.Set
的重载。该表达式不是直接编译和执行的,而是被转换为原生MongoDB语法,并用作mongo db查询的一部分(与实体框架或其他ORM将表达式转换为SQL的方式相同)。这基本上是说"更新所有概述配置文件,并将匹配条件的第一个顾问的IsCurrent标志设置为advisor.IsCurrent
值"。因为MongoDB允许负索引(意味着-相对于集合的结束)-C#MongoDB驱动程序可以将您的表达式转换为有效的MongoDB查询(但请参阅下面的更新)。
更新。如here所述,-1对于MongoDB C#驱动程序仍然具有特殊意义。将转换为positional update operator $:
位置$运算符用作第一个元素的占位符 与查询文档匹配
例如:
var updateDefinition = new UpdateDefinitionBuilder<OverviewProfile>()
.Set(a => a.Advisors[-1].IsCurrent, false);
colleciton.UpdateOne(c => c.Advisors.Any(r => r.IsCurrent), updateDefinition);
将转换为类似以下内容:
"updates": [{
"q": {
"Advisors": {
"$elemMatch": {
"IsCurrent": true
}
}
},
"u": {
"$set": {
"Advisors.$.IsCurrent": false // <- your expression
}
}
}
]
但是,MongoDB中关于负索引相对于集合结束的含义的观点仍然成立,因为除了-1(例如-2)以外的任何其他负索引都将被转换为如下查询:
{ "$set" : { "Advisors.-2.IsCurrent" : false} }
这篇关于在-1\f25 C#-1\f6列表的索引中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在-1\f25 C#-1\f6列表的索引中
基础教程推荐
- 使用 SED 在 XML 标签之间提取值 2022-01-01
- 当键值未知时反序列化 JSON 2022-01-01
- C# - 如何列出发布到 ASPX 页面的变量名称和值 2022-01-01
- 从 VB6 迁移到 .NET/.NET Core 的最佳策略或工具 2022-01-01
- C# - 将浮点数转换为整数...并根据余数更改整数 2022-01-01
- 覆盖 Json.Net 中的默认原始类型处理 2022-01-01
- 我什么时候应该使用 GC.SuppressFinalize()? 2022-01-01
- 创建属性设置器委托 2022-01-01
- 如何使用OpenXML SDK将Excel转换为CSV? 2022-01-01
- Page.OnAppearing 中的 Xamarin.Forms Page.DisplayAlert 2022-01-01