将MongoDB C#驱动程序顺序文档字段与继承的类型对象一起使用

将MongoDB C#驱动程序顺序文档字段与继承的类型对象一起使用,c#,asp.net-mvc,mongodb,c#-4.0,bson,C#,Asp.net Mvc,Mongodb,C# 4.0,Bson,我的C#中有以下两个类,我在Mongo集合中使用bSoElement进行属性排序。但是收车并没有执行这个命令 这里的想法是在BaseEntity类中有这个公共字段,并在几乎所有类上继承它 public class Car: BaseEntity{ [BsonElement(Order = 1)] public string Color{ get; set; } [BsonElement(Order = 2)] public long Price{ get; set; }

我的C#中有以下两个类,我在Mongo集合中使用bSoElement进行属性排序。但是收车并没有执行这个命令

这里的想法是在
BaseEntity
类中有这个公共字段,并在几乎所有类上继承它

public class Car: BaseEntity{
   [BsonElement(Order = 1)]
   public string Color{ get; set; }
   [BsonElement(Order = 2)]
   public long Price{ get; set; }
}

public class BaseEntity{
   [BsonElement(Order = 99)]
   public DateTime DateAdded{ get; set; }
   [BsonElement(Order = 100)]
   public bool IsActive{ get; set; }
}
Mongo的汽车收集结果如下。基类属性在文档和子类中排在第一位,尽管我有
bsonement(Order=xx)

我用魔杖把这个弄得像

{
   "_id" :ObjectId(fsdfsdfsdfsdfs),
   "Color" : "Red",
   "Price" : NumberLong(23564)
   "DateAdded": ISO("SomeDate"),
   "IsActive" : true
}
驾驶员详细信息

  <package id="mongocsharpdriver" version="2.2.4" targetFramework="net461" />
  <package id="MongoDB.Bson" version="2.2.4" targetFramework="net461" />
  <package id="MongoDB.Driver" version="2.2.4" targetFramework="net461" />
  <package id="MongoDB.Driver.Core" version="2.2.4" targetFramework="net461" />

也许它不会落入预期的答案,但类中使用的属性在那个里是受尊重的,这意味着序列化程序首先使用它的基本元素构建最终的类,然后使用来自具体对象的元素

为了测试这一点,我创建了类bus:car

public class Bus:Car{
[BsonElement(Order = 1)]
   public string BusColor{ get; set; }
   [BsonElement(Order = 2)]
   public long BusPrice{ get; set; }
}
输出刚刚证实:

{
    "_id" : ObjectId("5799eb7c1751a60613b36cbc"),
    "DateAdded" : ISODate("2016-07-28T11:24:44.222Z"),
    "IsActive" : true,
    "Color" : "Black-White",
    "Price" : NumberLong(923),
    "BusColor" : "Blue",
    "BusPrice" : NumberLong(12345)
}
你打算用这种排序来解决什么样的问题

欢迎评论

==========

编辑 在bson驱动程序源代码中找到

 private void OrderMembers()
    {
        // only auto map properties declared in this class (and not in base classes)
        var hasOrderedElements = false;
        var hasUnorderedElements = false;
        foreach (var memberMap in _declaredMemberMaps)
        {
            if (memberMap.Order != int.MaxValue)
            {
                hasOrderedElements |= true;
            }
            else
            {
                hasUnorderedElements |= true;
            }
        }

        if (hasOrderedElements)
        {
            if (hasUnorderedElements)
            {
                // split out the unordered elements and add them back at the end (because Sort is unstable, see online help)
                var unorderedElements = new List<BsonMemberMap>(_declaredMemberMaps.Where(pm => pm.Order == int.MaxValue));
                _declaredMemberMaps.RemoveAll(m => m.Order == int.MaxValue);
                _declaredMemberMaps.Sort((x, y) => x.Order.CompareTo(y.Order));
                _declaredMemberMaps.AddRange(unorderedElements);
            }
            else
            {
                _declaredMemberMaps.Sort((x, y) => x.Order.CompareTo(y.Order));
            }
        }
    }
private void OrderMembers()
{
//仅在此类(而不是基类)中声明的自动映射属性
var hasOrderedElements=false;
var hasUnorderedElements=false;
foreach(declaredMemberMaps中的var memberMap)
{
if(memberMap.Order!=int.MaxValue)
{
hasOrderedElements |=真;
}
其他的
{
ha无序元素|=真;
}
}
if(hasOrderedElements)
{
如果(有无序元素)
{
//将无序的元素拆分出来,并在最后添加回来(因为排序不稳定,请参阅联机帮助)
var unorderedElements=新列表(_declaredMemberMaps.Where(pm=>pm.Order==int.MaxValue));
_declaredMemberMaps.RemoveAll(m=>m.Order==int.MaxValue);
_declaredMemberMaps.Sort((x,y)=>x.Order.CompareTo(y.Order));
_declaredMemberMaps.AddRange(无序元素);
}
其他的
{
_declaredMemberMaps.Sort((x,y)=>x.Order.CompareTo(y.Order));
}
}
}

也许它不会落入预期的答案,但类中使用的属性在那个里是受尊重的,这意味着序列化程序首先使用它的基本元素构建最终的类,然后使用来自具体对象的元素

为了测试这一点,我创建了类bus:car

public class Bus:Car{
[BsonElement(Order = 1)]
   public string BusColor{ get; set; }
   [BsonElement(Order = 2)]
   public long BusPrice{ get; set; }
}
输出刚刚证实:

{
    "_id" : ObjectId("5799eb7c1751a60613b36cbc"),
    "DateAdded" : ISODate("2016-07-28T11:24:44.222Z"),
    "IsActive" : true,
    "Color" : "Black-White",
    "Price" : NumberLong(923),
    "BusColor" : "Blue",
    "BusPrice" : NumberLong(12345)
}
你打算用这种排序来解决什么样的问题

欢迎评论

==========

编辑 在bson驱动程序源代码中找到

 private void OrderMembers()
    {
        // only auto map properties declared in this class (and not in base classes)
        var hasOrderedElements = false;
        var hasUnorderedElements = false;
        foreach (var memberMap in _declaredMemberMaps)
        {
            if (memberMap.Order != int.MaxValue)
            {
                hasOrderedElements |= true;
            }
            else
            {
                hasUnorderedElements |= true;
            }
        }

        if (hasOrderedElements)
        {
            if (hasUnorderedElements)
            {
                // split out the unordered elements and add them back at the end (because Sort is unstable, see online help)
                var unorderedElements = new List<BsonMemberMap>(_declaredMemberMaps.Where(pm => pm.Order == int.MaxValue));
                _declaredMemberMaps.RemoveAll(m => m.Order == int.MaxValue);
                _declaredMemberMaps.Sort((x, y) => x.Order.CompareTo(y.Order));
                _declaredMemberMaps.AddRange(unorderedElements);
            }
            else
            {
                _declaredMemberMaps.Sort((x, y) => x.Order.CompareTo(y.Order));
            }
        }
    }
private void OrderMembers()
{
//仅在此类(而不是基类)中声明的自动映射属性
var hasOrderedElements=false;
var hasUnorderedElements=false;
foreach(declaredMemberMaps中的var memberMap)
{
if(memberMap.Order!=int.MaxValue)
{
hasOrderedElements |=真;
}
其他的
{
ha无序元素|=真;
}
}
if(hasOrderedElements)
{
如果(有无序元素)
{
//将无序的元素拆分出来,并在最后添加回来(因为排序不稳定,请参阅联机帮助)
var unorderedElements=新列表(_declaredMemberMaps.Where(pm=>pm.Order==int.MaxValue));
_declaredMemberMaps.RemoveAll(m=>m.Order==int.MaxValue);
_declaredMemberMaps.Sort((x,y)=>x.Order.CompareTo(y.Order));
_declaredMemberMaps.AddRange(无序元素);
}
其他的
{
_declaredMemberMaps.Sort((x,y)=>x.Order.CompareTo(y.Order));
}
}
}

顺序很有意义,因为您正在实现继承…这就是为什么基类首先进行排序…重写此命令的唯一方法应该是实现一个重写BsonElement的类…但是,由于您的类太小,为什么要执行继承,或者您只是出于实践目的执行此操作?这是一个示例代码,我在基类中有大约8个属性,需要在所有Mongo集合(类)中继承,是的,这也是为了实践。如果我有8个集合类,我不想在8个子类中重复这个基类属性只是为了测试:如果你从基类中删除了Order?与out Order没有区别,这很奇怪……根据docs
的说法,任何没有明确顺序的字段或属性都会出现在那些有明确顺序的字段或属性之后顺序。
顺序很有意义,因为您正在实现继承…这就是为什么基类首先进行排序…重写此命令的唯一方法应该是实现一个重写BsonElement的类…但是,由于您的类太小,为什么要执行继承,或者您只是出于实践目的执行此操作?这是一个示例代码,我在基类中有大约8个属性,需要在所有Mongo集合(类)中继承,是的,这也是为了实践。如果我有8个集合类,我不想在8个子类中重复这个基类属性只是为了测试:如果你从基类中删除了Order?与out Order没有区别,这很奇怪……根据docs
的说法,任何没有明确顺序的字段或属性都会出现在那些有明确顺序的字段或属性之后顺序。
正如我在问题中所解释的,我希望基类属性位于最后。那么我该如何实现呢?它在Mongo查询的JSON文档中的显示顺序,我不希望这些字段显示在顶部,我们必须滚动每个结果以获得特定的记录详细信息,正如我在问题中解释的,我希望基类属性位于最后。那么我该如何实现它呢?好吧,它的显示顺序