我在实体框架中使用了以下实体模型:
public class User {
public int Id { get; set; }
public string Name { get; set; }
public string EMail { get; set; }
}
现在我正在尝试向用户显示视图(WPF中的MVVM,ASP.NET中的MVC ......),以及数据库中不可用的其他信息,但可以在运行时获取来自服务。
为此,我创建了一个派生模型类:
public class UserDetail : User {
public bool IsOnline { get; set; }
}
现在有一些乱码描述了我想要实现的目标:
var users = _myContext.Users
.ToList()
.Select(x => new UserDetail() {
IsOnline = _myUserService.IsOnline(x.Id)
} = (UserDetail)x); // downcast x (User) to the new UserDetail instance
return View["MyView", users];
现在,向下转换在C#中不起作用..我还有其他选择来实现我想要的吗?
答案 0 :(得分:1)
您可以通过复制将构造函数添加到UserDetail。
public class UserDetail : User
{
public UserDetail(User x)
{
this.Id = x.Id;
this.Name = x.Name;
this.EMail = x.EMail;
}
public bool IsOnline { get; set; }
}
(如果你有很多具有这种行为的类,那么T4可以生成那种构造函数)
然后,更改你的linq并使用该构造函数:
var users = _myContext.Users
.ToList()
.Select(x => new UserDetail(x) {
IsOnline = _myUserService.IsOnline(x.Id)
});
return View["MyView", users];
答案 1 :(得分:0)
不,您必须逐个复制属性,或者编写一些代码来为您完成。
答案 2 :(得分:0)
创建单独的视图模型。您不应扩展实体模型以适应视图所需的属性。然后,您可以像zahorak建议的那样逐个复制属性,也可以使用专门为此任务创建的库,如AutoMapper。