[英]entity framework column projection
我有这个模型:
public partial class SystemUser
{
[Display(Name = "User")]
public string Username { get; set; }
[Display(Name = "Pass")]
public string Password { get; set; }
[Display(Name = "Admin")]
public Nullable<bool> Type { get; set; }
}
此函数返回SystemUser的所有记录:
public IEnumerable<object> GetAll()
{
var Users = Ctx.SystemUsers.ToList().Select(u => new SystemUser
{
Username = u.Username,
Type = u.Type
});
return Users.ToList();
}
但此查询也有密码列,我不需要此。如何从查询中删除此列? 我不想使用匿名类型,因为它删除了数据注释
您应该在GetAll()
方法中返回Anonymous Types
。 像这样更改GetAll
:
public IEnumerable<object> GetAll()
{
var Users = Ctx.SystemUsers.ToList().Select(u => new
{
User = u.Username,
Admin = u.Type
});
return Users.ToList();
}
没有原始sql,就无法做到这一点。 您总是使用实体框架获取整个表行。
尝试这个:
public IEnumerable<object> GetAll()
{
return Ctx.SystemUsers.Select(u => new
{
Username = u.Username,
Type = u.Type
}).ToList();
}
您可以使用DTO和AutoMapper可查询 扩展来支持这种情况:
public class SystemUserDto
{
[Display(Name = "User")]
public string Username { get; set; }
[Display(Name = "Admin")]
public Nullable<bool> Type { get; set; }
}
...
Mapper.CreateMap<SystemUser, SystemUserDto>();
...
public IEnumerable<SystemUserDto> GetAll()
{
var Users = Ctx.SystemUsers.Project().To<SystemUserDto>();
}
基于一个以上问题的不必要的交流意见,听起来您真正要问的是:
我有一个包含
Password
字段的类型,该字段是从Entity Framework数据库中获取的。 这种类型包括我需要在自动生成的UI中使用的数据注释。 我无法控制UI。 如何为UI提供包含这些数据注释但不包含Password
字段的类型?
在这种情况下,请定义另一种类型:
public class SystemUserViewModel
{
[Display(Name = "User")]
public string Username { get; set; }
[Display(Name = "Admin")]
public Nullable<bool> Type { get; set; }
}
并转换为该类型:
Ctx.SystemUsers.ToList().Select(u => new SystemUserViewModel
{
Username = u.Username,
Type = u.Type
});
如果使用匿名对象,则没有类定义,因此没有任何属性(数据注释)。 如果使用SystemUser
类型,则将具有“ Password
属性。 要使用这些都不是的东西,您必须定义一个类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.