MongoDB.net 驱动程序 - 项目不同 class
MongoDB.net driver - project into different class
当尝试将类型化文档投影到不同的 class 时,我得到以下信息:找不到与构造函数参数 "origItem"[= 匹配的成员34=] 在表达式树 new NewItem({document}, 1021).
中类型 "NewItem"
classes 的简化示例如下:
public class OriginalItem
{
public ObjectId Id { get; set; }
public string Name { get; set; }
public IList<double> Data { get; set; }
public OriginalItem() { }
}
public class NewItem
{
public ObjectId Id { get; set; }
public string Name { get; set; }
public double Value { get; set; }
public NewItem() { }
public NewItem( OriginalItem origItem, int targetIdx )
{
Id = origItem.Id;
Name = origItem.Name;
Value = origItem.Data[targetIdx];
}
}
发生问题的示例如下:
IList<ObjectId> ids; // list of OriginalItem Ids to get
IMongoCollection<OriginalItem> collection = _db.GetCollection<OriginalItem>("items");
int targetIdx = 50;
IList<NewItem> newItems = await collection.Aggregate()
.Match( item => ids.Contains( item.Id ) )
.Project( origItem => new NewItem( origItem, targetIdx ) )
.ToListAsync();
我环顾四周,似乎 是项目并将 origItem 转换为 BsonDocument,并将其反序列化为 NewItem 。我还测试了将 new NewItem( origItem, targetIdx )
更改为 new NewItem { //... }
的方法。
我知道我可以简单地读取项目并在 mongo 服务器之外执行必要的转换,但实际用例稍微复杂一些,我想至少弄清楚我在做什么看不懂。
谢谢
我也 运行 关注这个问题。在网上搜索了一段时间后,我终于发现使用 Builder
的 Project.Expression
方法是唯一可行的方法。对于您的场景,它会导致如下内容
var project = Builders<OriginalItem>.Projection.Expression(item => new NewItem(origItem, targetInx));
IList<NewItem> newItems = await collection.Aggregate()
.Match( item => ids.Contains( item.Id ) )
.Project(project)
.ToListAsync();
我还删除了所有构造函数逻辑,而是让它直接赋值。所以而不是
new NewItem(origItem, targetInx)
你最终会得到类似 new NewItem(item.Id, item.Name, item.Data[targetIdx])
的结果。我不确定这一步是否有必要,但如果上述方法不起作用,那么我一定会尝试这个。
当尝试将类型化文档投影到不同的 class 时,我得到以下信息:找不到与构造函数参数 "origItem"[= 匹配的成员34=] 在表达式树 new NewItem({document}, 1021).
中类型 "NewItem"classes 的简化示例如下:
public class OriginalItem
{
public ObjectId Id { get; set; }
public string Name { get; set; }
public IList<double> Data { get; set; }
public OriginalItem() { }
}
public class NewItem
{
public ObjectId Id { get; set; }
public string Name { get; set; }
public double Value { get; set; }
public NewItem() { }
public NewItem( OriginalItem origItem, int targetIdx )
{
Id = origItem.Id;
Name = origItem.Name;
Value = origItem.Data[targetIdx];
}
}
发生问题的示例如下:
IList<ObjectId> ids; // list of OriginalItem Ids to get
IMongoCollection<OriginalItem> collection = _db.GetCollection<OriginalItem>("items");
int targetIdx = 50;
IList<NewItem> newItems = await collection.Aggregate()
.Match( item => ids.Contains( item.Id ) )
.Project( origItem => new NewItem( origItem, targetIdx ) )
.ToListAsync();
我环顾四周,似乎 new NewItem( origItem, targetIdx )
更改为 new NewItem { //... }
的方法。
我知道我可以简单地读取项目并在 mongo 服务器之外执行必要的转换,但实际用例稍微复杂一些,我想至少弄清楚我在做什么看不懂。
谢谢
我也 运行 关注这个问题。在网上搜索了一段时间后,我终于发现使用 Builder
的 Project.Expression
方法是唯一可行的方法。对于您的场景,它会导致如下内容
var project = Builders<OriginalItem>.Projection.Expression(item => new NewItem(origItem, targetInx));
IList<NewItem> newItems = await collection.Aggregate()
.Match( item => ids.Contains( item.Id ) )
.Project(project)
.ToListAsync();
我还删除了所有构造函数逻辑,而是让它直接赋值。所以而不是
new NewItem(origItem, targetInx)
你最终会得到类似 new NewItem(item.Id, item.Name, item.Data[targetIdx])
的结果。我不确定这一步是否有必要,但如果上述方法不起作用,那么我一定会尝试这个。