Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用EF从数据库中获取特定列_C#_Entity Framework_Asp.net Web Api - Fatal编程技术网

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….方法,并且此方法无法转换为存储表达式。”