2016-07-26 3 views
1

У меня есть следующие два класса на моем C#, и я использую BsonElement для заказа собственности в Mongo Collection. Но Car collection не выполняет этот порядок.using MongoDB C# Код драйвера Поля документов с унаследованными объектами типа

Идея здесь иметь это общее поле в классе 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; } 
} 

коллекция автомобилей в Монго оказывается следующим. свойства базового класса приходят первые в документе и ребенка класса, хотя у меня есть BsonElement(Order=xx)

{ 
    "_id" :ObjectId(fsdfsdfsdfsdfs), 
    "DateAdded": ISO("SomeDate"), 
    "IsActive" : true, 
    "Color" : "Red", 
    "Price" : NumberLong(23564) 
} 

Я палочка это выглядеть как

{ 
    "_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" /> 
+0

заказ делает чувства, так как вы реализуете наследство ... это почему первый класс заказывает первый ... единственный способ переопределить это, должен быть реализован класс, который переопределяет BsonElement ... но, поскольку ваш класс настолько мал, почему наследование, или вы просто делаете это для практических целей ? – Hackerman

+0

Это пример кода, у меня есть около 8 свойств в базовом классе, которые необходимо унаследовать во всех коллекциях Mongo (классы) и да, это также для практики. Если у меня есть 8 классов коллекции, я не хочу повторять эти свойства базового класса в 8 дочерних классах – HaBo

+0

Просто для тестирования: и если вы удалите «Заказ» из базового класса? – Hackerman

ответ

0

может быть, он не будет падать в ожидаемом ответе, но атрибуты, используемые внутри класса, соблюдаются там, что означает, что serializer строит последний класс, используя сначала базовые элементы, затем элементы из конкретного o ▪ Таблица.

Чтобы проверить это, я создал класс автобус: автомобиль

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) 
} 

Какие проблемы вы собираетесь решить с помощью этой сортировкой?

Любые комментарии приветствуются!

==========

EDIT

обнаружил, что в 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)); 
      } 
     } 
    } 
+0

AS Я объяснил в своем вопросе, что я хочу, чтобы свойства базового класса были в конце. Итак, как я могу это достичь? – HaBo

+0

tbh - какую проблему вы собираетесь решить? – profesor79

+0

Ну, его порядок отображения в документе JSON по Mongo Queries, я не хочу, чтобы эти поля отображались сверху, нам нужно прокручивать каждый результат, чтобы получить конкретные данные записи. – HaBo