在-1\f25 C#-1\f6列表的索引中 [英] -1 in the index of a list in C#

查看:0
本文介绍了在-1\f25 C#-1\f6列表的索引中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

在上面的代码中,AdvisorsListUpdateDefinitionBuilder来自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属性并进行检查,它也工作得很好。

推荐答案

您正在使用预期ExpressionUpdateDefinitionBuilder<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列表的索引中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆