Вопрос по c#-4.0, mongodb – Наследование в MongoDb: как запрашивать экземпляры определенного типа

4

Вот как я использовал наследование в Entity Framework (POCO):

ctx.Animals // base class instances (all instances)
ctx.Animals.OfType<Cat>  // inherited class Cat's instances only
ctx.Animals.OfType<Dog> // inherited class Dog's instances only

Это единственный подобный способ, который я нашел в MongoDb (MongoDb ссылка):

var query = Query.EQ("_t", "Cat");
var cursor = collection.FindAs<Animal>(query);

Обратите внимание, что в последнем случае мне приходится иметь дело с дискриминатором (& quot; _t & quot;) и жестким кодом моего имени класса, что не совсем удобно и выглядит ужасно. Если я пропускаю запрос, я получаю исключение при попытке перечисления. Я что-то пропустил? Моим предложением был документ Db, в котором хранятся объекты «как есть». должен легко обрабатывать наследство.

Ваш Ответ

5   ответов
0

Если единственной проблемой является жесткое имя класса, вы можете сделать что-то вроде этого:

collection = db.GetCollection<Animal>("Animals");
var query = Query.EQ("_t", typeof(Cat).Name);
var cursor = collection.Find(query);
1

Error: User Rate Limit ExceededError: User Rate Limit Exceeded:

The one case where you must call RegisterClassMap yourself (even without arguments) is when you are using a polymorphic class hierarchy: in this case you must register all the known subclasses to guarantee that the discriminators get registered.


Error: User Rate Limit Exceeded

BsonClassMap.RegisterClassMap<Animal>();
BsonClassMap.RegisterClassMap<Cat>();
BsonClassMap.RegisterClassMap<Dog>();

Error: User Rate Limit Exceeded

collection = db.GetCollection<Animal>("Animals");

Error: User Rate Limit Exceeded

var query = Query.EQ("_t", "Cat");
var cursor = collection.Find(query);
0

Error: User Rate Limit ExceededError: User Rate Limit Exceeded

Основная причина, по которой вы можете выбрать использование иерархических дискриминаторов, заключается в том, что это делает возможным запрос всех экземпляров любого класса в иерархии. Например, чтобы прочитать все документы Cat, мы можем написать:

var query = Query.EQ("_t", "Cat");
var cursor = collection.FindAs<Animal>(query);
foreach (var cat in cursor) {
    // process cat
}
4

Error: User Rate Limit Exceeded_tError: User Rate Limit Exceeded

Error: User Rate Limit ExceededdiscriminatorError: User Rate Limit Exceeded

Вы могли бы сделать что-то вроде этого:

public abstract class SomeBaseClass
{
    public const string FirstSubClass = "first";
    public const string SecondSubClass = "second";
}

[BsonDiscriminator(SomeBaseClass.FirstSubClass)]
public class FirstSubClass { ... }

Error: User Rate Limit Exceeded

var entireCollection = db.GetCollection<FirstSubClass>("coll");

var subs = entireCollection.Find(Query.Eq("_t", SomeBaseClass.FirstSubClass));
Error: User Rate Limit Exceeded YMC
9

var results = collection.AsQueryable<Animal>().OfType<Cat>

Error: User Rate Limit Exceeded

Похожие вопросы