实体框架列投影

时间:2015-09-03 14:54:03

标签: c# entity-framework

我有这个型号:

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();
    }

但此查询也有密码列 我不需要这个。我可以从查询中删除此列吗? 我不想使用anonymus类型,因为它删除了dataannotation

5 个答案:

答案 0 :(得分:1)

您应该在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();
}

答案 1 :(得分:0)

没有原始sql,没办法做到这一点。您始终使用Entity Framework获取整个表行。

答案 2 :(得分:0)

试试这个:

UILabel *a = [UILabel new];
a.text = @"Hi";
a.textColor = [UIColor blackColor];
[a sizeToFit];

UIView *b = [UIView new];
b.frame = CGRectMake(0, 0, CGRectGetWidth(a.frame) + 18.0f, 19.0f);
[b addSubview:a];

[a mas_makeConstraints:^(MASConstraintMaker *make) {
    make.centerX.equalTo(b.mas_centerX);
}];

答案 3 :(得分:0)

您可以使用DTO和AutoMapper Queryable Extensions来支持这种情况: -

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>();
}

答案 4 :(得分:0)

基于不止一个问题的不必要的意见交换,听起来像你真正要求的是:

  

我有一个包含Password字段的类型,我从实体框架的数据库中获取该字段。此类型包括我需要在自动生成的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属性。要使用既不是这些东西的东西,你必须定义一个类型。