C#中列表的索引中的-1

时间:2017-12-20 09:34:59

标签: c# mongodb-.net-driver

我最近在我们的应用程序中遇到了以下代码

var updateDefinition = new UpdateDefinitionBuilder<OverviewProfile>()
            .Set(a => a.Advisors[-1].IsCurrent, advisor.IsCurrent);

在上面的代码中,AdvisorsListhttp://jsfiddle.net/HgDA7/760/来自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 db。此类中没有其他方法,只有其他属性。

这是一个类,但是对于多个类的属性也有相同的用法,即使我们添加新的List属性并检查,它也能正常工作。

2 个答案:

答案 0 :(得分:8)

您正在使用期望UpdateDefinitionBuilder<T>.Set的{​​{1}}重载。此表达式不是直接编译和执行,而是转换为本机mongodb语法,并用作mongo db查询的一部分(与实体框架或其他ORM如何将表达式转换为SQL相同)。这基本上表示&#34;更新所有概述配置文件并设置第一个顾问的IsCurrent标志,该标志符合Expression值&#34;的标准。因为mongodb允许负索引(意思是 - 相对于集合的结尾) - C#mongodb驱动程序可以将表达式转换为有效的mongodb查询(但请参阅下面的更新)。

更新。如上所述here,-1仍然具有mongodb C#驱动程序的特殊含义。它将转换为positional update operator $

  

位置$运算符充当第一个元素的占位符   与查询文档匹配

例如:

advisor.IsCurrent

将转换为:

var updateDefinition = new UpdateDefinitionBuilder<OverviewProfile>()
    .Set(a => a.Advisors[-1].IsCurrent, false);

colleciton.UpdateOne(c => c.Advisors.Any(r => r.IsCurrent), updateDefinition);

然而,相对于mongodb中的colleciton结尾的负指数含义仍然成立,因为除了-1之外的任何其他负指数(例如,-2)将被转换为这样的查询:

"updates": [{
        "q": {
            "Advisors": {
                "$elemMatch": {
                    "IsCurrent": true
                }
            }
        },
        "u": {
            "$set": {
                "Advisors.$.IsCurrent": false // <- your expression
            }
        }
    }
]

答案 1 :(得分:1)

如果a.Advisors确实是List<T>,则没有用处。这将抛出ArgumentOutOfRangeException

更有可能的是,这是List<T>上的一些自定义类或实现,其中传递给索引器的-1值意味着类似“默认”值。

无论是什么,我认为这是一个糟糕的设计,应该避免。