Получение имен элементов из карты классов - PullRequest
0 голосов
/ 02 марта 2012

Вот класс, который я сопоставляю с MongoDB:

public class Thing
{
    [BsonId]
    public ObjectId Id { get; set; }
    public string Foo { get; set; }
    public string Bar { get; set; }
}

Прекрасно сохранить его в коллекции:

var collection = db.GetCollection<Thing>("things");
collection.Save(new Thing() {Foo = "one", Bar = "two"});

Но когда я хочу найти его, я должен явно указать имена элементов в виде строк:

var collection = db.GetCollection<Thing>("things");
collection.Find(Query.EQ("Foo", "one"));

Компилятор не может помочь с этими запросами. Я должен сослаться на мой файл класса, скопировать имя элемента и вставить его в запрос. Если я изменю имя элемента позже, компилятор не будет гарантировать, что я изменил его в запросах, не говоря уже об изменении его для меня. Есть ли лучший способ?

Ответы [ 2 ]

1 голос
/ 15 октября 2012

Если вы сохраните свою карту классов в личном кабинете, например, так:

private static BsonClassMap<Thing> _thingClassMap = BsonClassMap.RegisterClassMap<Thing>();

...

вы можете извлечь имя элемента:

string elementName = _thingClassMap.GetMemberMap<string>(c => c.Foo).ElementName;

...

и тогда вы можете просто создать функцию, которая переносит строку, извлекающую имя элемента, это все еще довольно раздражает, но это лучшее, что мы получили в данный момент, я думаю ..

 private string GetTypeMemberName<T>(Expression<Func<Foo, T>> memberLambda)
 {
        return _classMap.GetMemberMap<T>(memberLambda).ElementName;
 }

тогда вы можете просто получить имя элемента:

string elementName = GetTypeMemberName<string>(c => c.Foo);

Тогда, если вы реорганизовали свой код и позже переименовали свойство, оно также изменится в запросе.

Конечно, вы также можете просто использовать LINQ.

1 голос
/ 02 марта 2012

В настоящее время нет поддержки с точки зрения компилятора запросов в v1.3.1 официального драйвера. В настоящее время мы работаем над поддержкой LINQ, которая должна помочь с отображением имен элементов. (https://jira.mongodb.org/browse/CSHARP-91). Если вы хотите увидеть это вне LINQ, пожалуйста, отправьте запрос на улучшение на https://jira.mongodb.org/browse/CSHARP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...