我创建了一个我需要连接到知识库模型的viewmodel。我之前已经将视图模型连接到模型,但在这种情况下,结果的intellisense不会显示知识库模型的任何字段。这是我正在尝试的代码:
public ActionResult TechSearchKnowledgebase([Optional]Guid createdById, [Optional]Guid categoryId, [Optional]Guid typeId)
{
var model = db.Knowledgebases.AsQueryable();
if (createdById != Guid.Empty)
{
model = model.Where(k => k.CreatedById == createdById);
ViewBag.CreatedBy = db.Users.Where(c => c.UserId == createdById).First().FullName;
}
if (categoryId != Guid.Empty)
{
model = model.Where(k => k.CategoryId == categoryId);
ViewBag.Category = db.Categories.Where(c => c.CategoryId == categoryId).First().CategoryName;
}
if (typeId != Guid.Empty)
{
model = model.Where(k => k.TypeId == typeId);
ViewBag.Category = db.Roles.Where(c => c.RoleID == typeId).First().RoleDescription;
}
model=model.OrderBy(k => k.CreatedDate);
var result=model.ToList();
KnowledgebaseResult knowledgebaseResult = new KnowledgebaseResult();
knowledgebaseResult.CategoryId = result.CategoryId;
return View("TechKnowledgebaseList", result);
}
正如Chris在下面建议的那样,我安装了automapper并在我的应用启动中进行设置。但是,在这一行:
List<KnowledgebaseResult> knowledgebaseResults = Mapper.Map<KnowledgebaseResult>(model.ToList());
他建议,我收到错误,“不能隐式地将knowledgebaseResult转换为列表。
我错过了什么?
答案 0 :(得分:0)
您正在尝试访问单个模型的单个属性,但您正在与列表进行交互。为了映射您的CategoryId,您需要遍历列表中的每个项目并进行关联。有一些库可以使这种映射更清晰,例如AutoMapper(http://automapper.org/)。
使用AutoMapper,您只需在两个对象之间创建映射并传入数据源。
Mapper.CreateMap<Knowledgebase, KnowledgebaseResult>();
将上述内容放在配置文件中,该文件将在Application_Start上调用。
List<KnowledgebaseResult> knowledgebaseResults = Mapper.Map<List<KnowledgebaseResult>>(model.ToList());
现在每个KnowledgebaseResult都将从原始模型映射,假设所有属性都被命名为相同。如果没有,您可以使用以下语法覆盖映射:
Mapper.CreateMap<Knowledgebase, KnowledgebaseReslt>().ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.KBId));