2015-09-03 106 views
0

我有这样的模式:实体框架柱投影

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

,但此查询也password列 我不需要this.how我可以从查询中删除此列? 我不想使用anonymus类型,因为它删除dataannotation

+1

删除第一个'ToList()',你会好的 – haim770

+2

为什么当你知道你要返回'IEnumerable '时返回'IEnumerable '? – haim770

+0

@ haim770发生异常 – Mohammad

回答

1

您应该返回Anonymous TypesGetAll()方法。变更GetAll是这样的:

public IEnumerable<object> GetAll() 
{ 
    var Users = Ctx.SystemUsers.ToList().Select(u => new 
    { 
     User = u.Username, 
     Admin = u.Type 
    }); 

    return Users.ToList(); 
} 
+0

你的答案是好的,但我想用空间字例如 [字1字2] = u.Username 如何解决呢? – Mohammad

+1

@Mohammad你不能,C#的关键字不能有一个空间在其中 – Jcl

+0

@ user2946329您的帮助 – Mohammad

0

没有这样做的方式没有原始的sql。您总是使用实体框架获取整个表格行。

+2

好,谢谢并非总是如此,如果我们使用匿名类型的选择和选择'Ctx.SystemUsers.Select后提交查询(U =>新 { 用户= u.Username, 管理员= u.Type })ToList();',只有所需的属性将被提取 –

+0

@TaherRahgooy是你的权利,但我想用空间字 نامکاربری= u.Username 有一个想法? – Mohammad

+0

@TaherRahgooy据我所知,EF不支持投射到匿名类型(只名为的),这可能会抛出异常 – Jcl

0

试试这个:

public IEnumerable<object> GetAll() 
{ 
    return Ctx.SystemUsers.Select(u => new 
    { 
     Username = u.Username, 
     Type = u.Type 
    }).ToList(); 
} 
+1

这引发运行时错误,LINQ到实体不支持非匿名类型构建'Select'。 –

+1

错误是:“实体或复杂类型‘SystemUser’不能在LINQ被构造为实体查询 –

+0

列。‘密码’不删除您可以使用接口两个类继承这个接口有两个列,但,。在DbSet你将使用全班 –

0

您可以使用一个DTO和AutoMapperQueryable 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>(); 
} 
+0

感谢您的答案,但我有我的应用程序中有很多实体有这种情况 根据您的答案我必须创建许多DTO类 是不是一个好主意? – Mohammad

+0

@Mohammad是的,如果你需要他们 – Jcl

0

基础上的评论在一个以上的问题,不必要地参与交换,这听起来像你什么真的问是:

我有一个类型,其中包括一个Password字段,我使用实体框架从数据库中获得该字段。这种类型包含我需要在自动生成的用户界面中使用的数据注释。我无法控制用户界面。我如何为包含这些数据注释的类型提供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属性。要使用这些都不是这些东西,你必须定义一个类型。