Я как бы новичок в драйвере MongoDB, поэтому у меня небольшая путаница относительно запросов.
У меня есть коллекции со следующими классами:
[BsonCollection("alerts")]
public class Alert
{
public ObjectId Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
[BsonRepresentation(BsonType.ObjectId)]
public string AlertTypeId { get; set; }
[BsonIgnore]
public AlertType AlertType { get; set; }
}
[BsonCollection("alert_types")]
public class AlertType
{
public ObjectId Id { get; set; }
public string Name { get; set; }
}
I ' m пытается заполнить свойство AlertType в Alert, используя оператор Lookup. Я пробовал следующее:
var collection = database.GetCollection<Alert>(GetCollectionName(typeof(Alert)));
var query = collection.Aggregate()
.Lookup("alert_types", "AlertTypeId", "Id", "AlertType")
.Unwind("AlertType")
.As<Alert>()
.ToList();
Но это возвращает пустой список.
Я тоже пробовал это:
var query = collection.Aggregate()
.Lookup("alert_types", x => ObjectId.Parse(x.AlertTypeId), y => y.Id, "AlertType")
.Unwind("AlertType")
.As<Alert>()
.ToList();
Но я получаю ошибку в поиске разметка:
"Аргументы типа для метода IAggregateFluent.Lookup (строка, FieldDefinition, FieldDefinition, FieldDefinition, AggregateLookupOptions ) 'не может быть выведено из использования. Попробуйте указать аргументы типа явно. "
Более того, попробовал с коллекциями как Queryable следующим образом:
IEnumerable<Alert> query = from a in collection.AsQueryable()
join o in typesCollection.AsQueryable() on a.AlertTypeId equals o.Id.ToString() into joinedAlertTypes
select new Alert(a, joinedAlertTypes.FirstOrDefault());
(Реализуя, как видите, конструктор в Alert, который назначает все свои свойства, а также AlertType из соединения)
Но я получаю сообщение об ошибке:
Невозможно определить информацию о сериализации для селектора внутреннего ключа в дереве: aggregate ([ ]). GroupJoin (aggregate ([]), a => a.AlertTypeId, o => o.Id.ToString (), (a, connectedAlertTypes) => new <> f__AnonymousType0`2 (a = a, connectedAlertTypes = connectedAlertTypes ))
Что я делаю не так?