0

我有以下代码工作:

var Logs = MvcApplication.MongoLoggingDatabase.GetCollection<Log>("Log")
            .Find(queryDocument)
            .Select(x => new LogDto { ModelNumber = x.Request.ModelNumber, Make = x.Request.Make, TimeStamp = x.TimeStamp, UserId = x.UserId })
            .OrderByDescending(x => x.TimeStamp)
            .Skip(pageSize * (page - 1))
            .Take(pageSize);

我可以将结果映射到 LogDto。但我想知道是否可以改用 FindAs,这样我就可以查询我想要的字段并按预期映射对应的子属性。

我尝试了类似以下的方法:

var Logs = MvcApplication.MongoLoggingDatabase.GetCollection<Log>("Log")
                .FindAs<LogDto>(queryDocument)
                .SetFields(Fields.Exclude("_id").Include("TimeStamp", "UserId", "Request_ModelNumber", "Request_Make"))
                 .OrderByDescending(x => x.TimeStamp)
                .Skip(pageSize * (page - 1))
                .Take(pageSize);

TimeStamp 和 UserId 映射正确,但 Make 和 ModelNumber 仅显示 null。我想知道如何使用 SetFields 将 Request.ModelNumber 和 Request.Make 映射到 LogDto 上的相应字段(Make 和 Model)。

4

1 回答 1

0

你可能做不到。SetFields 可用于选择返回哪些字段,但不能用于重塑返回的文档。反序列化 LogD 所需的所有值都必须来自 BSON 文档的同一级别(而不是其中一些嵌套在像 ModelNumber 和 Make 这样的请求中)。

您要么必须使您的班级与文档格式匹配,要么更改您的文档格式以匹配您的班级。

于 2012-05-22T19:04:49.863 回答