【问题标题】:Fetch single table data from Entity Framework从实体框架中获取单表数据
【发布时间】:2018-01-02 21:48:01
【问题描述】:

我在 Sql-Server 中有五个表,它们使用外键链接。

下面我正在显示数据库表和链接的图像。

例如,我尝试从用户表中获取特定用户 ID 的用户数据,我正在获取所有五个表的内连接行。

但我只需要来自用户表的数据。我尝试编写查询、sql 过程以及 Linq。

总之,我得到了与所有五个表连接的数据。

我怎样才能从一张表中获取数据?

我尝试使用过程,

       object[] xparams = {
        new SqlParameter("@UserName", "Admin"),
        new SqlParameter("@UserPwd", "1234"),
        new SqlParameter("@AppType", 1)

        };
    var user = db.Database.ExecuteSqlCommand("exec proc_authenticate_tocken @UserName, @UserPwd, @AppType ", xparams);

另一个使用查询,

db.Users.SqlQuery("select * from users where PhoneNumber ='"+ user_name + "' and   Password = '" + password + "' and TypeId=" + user_type + " and Status = 1;").ToList();

Lsing Linq,

var ty = db.Users.Where(emp => emp.Password == password && 
        emp.PhoneNumber == phone_number)
                           ;

下面的代码是实体模型类,使用实体框架自动生成。

 public partial class User
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public User()
    {
        this.TockenPools = new HashSet<TockenPool>();
        this.TockenProcesses = new HashSet<TockenProcess>();
    }

    public int Id { get; set; }
    public Nullable<int> TypeId { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public string PhoneNumber { get; set; }
    public string ActualName { get; set; }
    public Nullable<System.DateTime> LastLogin { get; set; }
    public Nullable<int> LoginCount { get; set; }
    public Nullable<int> Status { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<TockenPool> TockenPools { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<TockenProcess> TockenProcesses { get; set; }
    public virtual User Users1 { get; set; }
    public virtual User User1 { get; set; }
    public virtual UserType UserType { get; set; }
}

【问题讨论】:

  • 只禁用延迟加载。
  • 不需要其他表的相关数据吗?
  • 我需要来自其他表的数据,但在这种情况下,我只需要来自 USER 表的数据,稍后我还需要来自其他表的连接数据。
  • 检查我的答案。我是根据我对你的Q的理解写的。如果有什么不同,请通知我。
  • 我正在尝试禁用lazyLoading,但我仍然遇到同样的错误。

标签: asp.net-mvc entity-framework linq asp.net-web-api


【解决方案1】:

在我的上下文中,我设法使用 LINQ 本身获得了结果,

But i am not so sure that this is a good practice or not, since the 

ObjUser 对象通过连接图中的所有表来承载所有数据。

        var Result = from ObjUser in db.Users
                           where ((ObjUser.PhoneNumber == user_name ||
                           ObjUser.UserName == user_name) &&
        (ObjUser.Password == password))
                           select new
                           {
                               ObjUser.Id,
                               ObjUser.ActualName,

                               ObjUser.LastLogin,
                               ObjUser.PhoneNumber
                           };
        var ty = db.Users.Where(emp => emp.Password == password &&
        emp.PhoneNumber == user_name)
                           ;

【讨论】:

  • 通过连接图中的所有表来承载所有数据 好吧,正如我上面所说,这是不可能的。通过显示由这条 LINQ 语句生成的 SQL 查询来说服我。
【解决方案2】:

您好,根据我对您的问题的了解,您只需要 users 表中的数据。所以请尝试下面的代码,

var SelectedUser = db.Users.Where(emp => emp.Password == password && 
    emp.PhoneNumber == phone_number).select(usr => new User{UserName =  usr.UserName , Password = usr.Password }).FisrtOrDefault();

同样,您可以包含与您的 user 类相关的任何内容

【讨论】:

  • 感谢您为我付出的努力,但我在使用您的语法时遇到以下错误,----- 消息“无法在 LINQ 中构造实体或复杂类型 'XXXXXXXXXXXXeModel.User'到实体查询。”字符串
  • 您可以创建一个重复的class,其中包含您需要来自users 类的属性并使用它
  • stackoverflow.com/questions/5325797/… 此链接将帮助您了解我要说明的有关异常的内容
  • 你能看到我上面的答案吗,如果我的方法有误,请纠正我。
  • 最好有一个 'class' 绑定到它,这样在处理你的结果时就很容易了。我对那个 User 类做了同样的方法..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多