2016-07-26 5 views
1

私はC#で次の2つのクラスを持っており、Mongo Collectionのプロパティ順序にBsonElementを使用しています。しかし、Carコレクションはこの命令を実装していません。ここMongoDB C#を使用したドライバの注文ドキュメントフィールド継承された型オブジェクトのフィールド

アイデアは、モンゴのほぼすべてのクラス

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

カーコレクションは、以下の通りであることが判明BaseEntityクラスでは、この一般的なフィールドを持っており、これを上の継承することです。私は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

これはコード例です。すべてのMongo Collections(クラス)で継承される必要があるBaseクラスのプロパティが約8あり、それは練習用です。私は8つのコレクションクラスを持っている場合私は8子クラスのこの基本クラスのプロパティを繰り返すしたくない – HaBo

+0

テストのためだけ:と基本クラスから注文を削除する場合は? – Hackerman

答えて

0

多分それは落下しないように見えるように、このワンド文書と子クラスで最初に来ています期待される答えになるが、クラス内で使用されている属性はそこで尊重される。つまり、シリアライザは基本要素を使用して最終クラスを構築し、次にコンクリートの要素回避する。それをテストする

は、私はクラスのバスを作成しました:

{ 
    "_id" : ObjectId("5799eb7c1751a60613b36cbc"), 
    "DateAdded" : ISODate("2016-07-28T11:24:44.222Z"), 
    "IsActive" : true, 
    "Color" : "Black-White", 
    "Price" : NumberLong(923), 
    "BusColor" : "Blue", 
    "BusPrice" : NumberLong(12345) 
} 

は、問題のどのようなあなたはそのソートで解決しようとしている:車

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

、出力はちょうどことを確認しましたか?

すべての歓迎! ==========

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

私は私の質問で説明したように、私は基本クラスのプロパティを最後にしたい。だから私はそれをどのように達成できますか? – HaBo

+0

tbh - あなたは何の問題を解決しようとしていますか? – profesor79

+0

Mongo QueriesのJSONドキュメントの表示順序がうまく表示されません。これらのフィールドが上に表示されないようにするには、各レコードの詳細をスクロールして – HaBo

関連する問題