ObjectId.ToString在投影中不起作用(LINQ)

时间:2017-06-09 12:29:49

标签: mongodb-.net-driver

执行此代码时出现异常:

List<TenantSelectorDto> foundSelectors = null;
//.....
foundSelectors = tenants
.Where(filter)
.Select(ts => new TenantSelectorDto
{
    Id = ts.Id.ToString(),
    Name = ts.Name,
    ShortName =  ts.ShortName,
    TenantCode = ts.TenantCode,
})
.ToList();

例外是:

NotSupportedException, Message: ToString of type System.Object is not supported in the expression tree {document}{_id}.ToString().

DTO中的

Id定义为字符串,而Id对象的Tenant是MongoDB ObjectId。 DTO是REST API的一部分,我不希望强制消费者仅仅因为数据类型ObjectId 而链接到整个MongoDB驱动程序库。

这是一个错误还是为什么.ToString在投影中使用时不起作用?

1 个答案:

答案 0 :(得分:0)

似乎是一个LINQ问题!我没有使用LINQ,而是尝试使用聚合框架,它在这里按预期工作!

var filterDefinition = Builders<Tenant>.Filter.Where(<Build whatever filter you need here>);

var foundSelectors = tenantCollection
    .Find(filterDefinition)
    .Project(ts => new TenantSelectorDto
    {
        Id = ts.Id.ToString(),
        Name = ts.Name,
        ShortName = ts.ShortName,
        TenantCode = ts.TenantCode,
    })
    .ToList();

技巧没有例外!

不知道这是一般的LINQ问题还是MongoDB LINQ实现的问题。