C# 使用EF从数据库中获取特定列
我有这个数据库:C# 使用EF从数据库中获取特定列,c#,entity-framework,asp.net-web-api,C#,Entity Framework,Asp.net Web Api,我有这个数据库: Users: -idUser -login -password -email Relationship: -idUser -idFriend 在我的模型中,我有: public class User { [Key, ScaffoldColumn(false), Display(Name = "ID user")] public int idUser { set; get; } [StringLength(16), Display(Name = "Lo
Users:
-idUser
-login
-password
-email
Relationship:
-idUser
-idFriend
在我的模型中,我有:
public class User
{
[Key, ScaffoldColumn(false), Display(Name = "ID user")]
public int idUser { set; get; }
[StringLength(16), Display(Name = "Login")]
public string login{ set; get; }
[StringLength(16), Display(Name = "Password")]
public string password{ set; get; }
[StringLength(64), Display(Name = "Email")]
public string email{ set; get; }
public virtual ICollection<User> friends{ get; set; }
public User()
{
friends = new List<User>();
}
}
一切正常,但我有一个小问题:当我想向客户端发送Json时,Json如下所示:
{"friends":[{"friends":[],"idUser":2,"login":"user2","password":"1234",
"email":"user2@gmail.com"],"idUser":1,"login":"user1","password":"0000",
"email":"myEamil@gmail.com",}
public virtual ICollection<UserView> friends{ get; set; }
但是,我不喜欢发送机密信息的朋友收集像密码给用户!
我想我可以通过在控制器中添加以下代码来解决此问题:
if (user.password.Equals(password))
{
me = user;
//adding this code :
foreach (User friend in me.friends)
{
friend.password = null;
//friend.email= null;
}
}
但我正在寻找最有意义的方法来做到这一点!
我希望有一种方法可以防止EF从数据库中获取某些列。您可以为用户创建不包含password属性的新视图类,比方说它被称为UserView类
UserView user = db.Users
.Where<User>(u =>u .login.Equals(login))
.Select(uw => new UserView ()
{
login = u.login,
email = u.email,
//do not include password here
}
)
.FirstOrDefault<User>();
UserView user=db.Users
其中(u=>u.login.Equals(login))
.Select(uw=>newuserview()
{
login=u.login,
电子邮件=美国电子邮件,
//此处不包括密码
}
)
.FirstOrDefault();
希望这有帮助 您可以为不包含password属性的用户创建新的视图类,比如说它被称为UserView类
UserView user = db.Users
.Where<User>(u =>u .login.Equals(login))
.Select(uw => new UserView ()
{
login = u.login,
email = u.email,
//do not include password here
}
)
.FirstOrDefault<User>();
UserView user=db.Users
其中(u=>u.login.Equals(login))
.Select(uw=>newuserview()
{
login=u.login,
电子邮件=美国电子邮件,
//此处不包括密码
}
)
.FirstOrDefault();
希望这有帮助 erkaner的答案是正确的,尽管您也可以使用匿名对象
var user = db.Users
.Where(u => u.login.Equals(login))
.Select(usr => new {
login = usr.login,
email = usr.email,
//basically include what you want
})
.FirstOrDefault();
erkaner的答案是正确的,尽管您也可以使用匿名对象
var user = db.Users
.Where(u => u.login.Equals(login))
.Select(usr => new {
login = usr.login,
email = usr.email,
//basically include what you want
})
.FirstOrDefault();
感谢回复,但我为我的案例找到了更好的解决方案,Martin Shishkov和erkaner的回答并没有解决我的问题,因为他们只是阻止EF获取用户密码,而不是朋友集合中的密码。 我在数据库中创建了一个名为UserViews的视图,其中包含用户的公共信息(在本例中,UserViews不包含密码属性),我还创建了一个名为UserView的模型,该模型也具有公共属性,我在用户模型中更改了friends集合,如下所示:
{"friends":[{"friends":[],"idUser":2,"login":"user2","password":"1234",
"email":"user2@gmail.com"],"idUser":1,"login":"user1","password":"0000",
"email":"myEamil@gmail.com",}
public virtual ICollection<UserView> friends{ get; set; }
公共虚拟ICollection好友{get;set;}
就像我期待的那样 感谢您的回复,但我为我的案例找到了更好的解决方案,Martin Shishkov和erkaner的回答并没有解决我的问题,因为他们只是阻止EF获取用户密码,而不是朋友集合中的密码。 我在数据库中创建了一个名为UserViews的视图,其中包含用户的公共信息(在本例中,UserViews不包含密码属性),我还创建了一个名为UserView的模型,该模型也具有公共属性,我在用户模型中更改了friends集合,如下所示:
{"friends":[{"friends":[],"idUser":2,"login":"user2","password":"1234",
"email":"user2@gmail.com"],"idUser":1,"login":"user1","password":"0000",
"email":"myEamil@gmail.com",}
public virtual ICollection<UserView> friends{ get; set; }
公共虚拟ICollection好友{get;set;}
就像我期待的那样 如果您想为用户的朋友指定要选择的内容,只需添加:
var user = db.Users
.Where(u => u.login.Equals(login))
.Select(usr => new {
login = usr.login,
email = usr.email,
friends = usr.Friends.Select(fr => new {
// your friend info here Ex.:
email = fr.email,
})
}).FirstOrDefault();
如果您想为用户的朋友指定要选择的内容,只需添加以下内容:
var user = db.Users
.Where(u => u.login.Equals(login))
.Select(usr => new {
login = usr.login,
email = usr.email,
friends = usr.Friends.Select(fr => new {
// your friend info here Ex.:
email = fr.email,
})
}).FirstOrDefault();
我也会这么做。尽管请注意,您可以删除Where方法上的用户类型说明符和匿名类型中的成员名称,但它们都可以由编译器推断出来。修正了!:)我也会这么做。尽管请注意,您可以删除Where方法上的用户类型说明符和匿名类型中的成员名称,但它们都可以由编译器推断出来。修正了!:)谢谢,现在它就像我期待的那样工作!请注意,您必须删除“ToList()”方法,因为它引发了一个异常:“LINQ to Entities无法识别方法System.Collections.Generic.List….方法,并且此方法无法转换为存储表达式。”谢谢,现在它的工作方式与我所期望的一样!请注意,您必须删除“ToList()”方法,因为它引发了一个异常:“LINQ to Entities无法识别System.Collections.Generic.List….方法,并且此方法无法转换为存储表达式。”