c# - MongoDB.net 驱动程序 - 项目到不同的类
问题描述
尝试将类型化文档投影到不同的类时,我得到以下信息:在表达式树 new NewItem({document}, 1021) 中,找不到类型“NewItem ”上的构造函数参数“origItem”的成员匹配项。
类的简化示例如下:
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])
. 我不确定这一步是否必要,但如果上述方法不起作用,那么我肯定也会尝试。
推荐阅读
- python - 如何在 Python 中更新字典中键字段的值?
- python - 在 Keras Sequential 模型中,Conv2D 似乎要求内核比前一层厚。为什么?
- matlab - 使用优化工具箱时如何解决“数组索引必须是正整数或逻辑值”?
- python-3.x - 从所有列中具有“无”值的数据框中删除行 - Python
- javascript - 路由器链接配置的目标不生成 html 代码
- arrays - 如何快速使用 Ms SQL 查询结果填充数组?
- c# - 当我使用 range.find 使用 vsto 搜索整个文档时,如何跳过表格?
- html - 如何将列表字典转换为html表?
- windows - 完成构建后如何从 appveyor 获取或下载构建的应用程序(exe 文件)
- ios - Xcode 搜索错误的框架搜索路径