【问题标题】:Get rows from 2 tables in one object从一个对象中的 2 个表中获取行
【发布时间】:2018-10-22 06:44:04
【问题描述】:

我有两张桌子:

[Company]

 - CompanyID
 - Company_Name 
 - softID

[User]

 - UserID 
 - CompanyID
 - User_Name

在我的后端,我有以下类:

Company 

 - CompanyID
 - Company Name
 - List<User> CompanyUsers

我只使用System.Data.SqlClient

我的问题是:

如何检索公司对象及其用户?

我目前在我的数据访问类中有这个方法:

public Company getCompany(int _softID)
        {
            Company temp = new Company();

            conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Database"].ConnectionString);
            SqlCommand command = new SqlCommand(@"SELECT * FROM company WHERE softID = @softID", conn);
            command.Parameters.Add("@softID", SqlDbType.Int).Value = _softID;
            {
                conn.Open();
                SqlDataReader reader = command.ExecuteReader();
                if (reader.Read())
                {
                    temp.CompanyID = int.Parse(reader["companyID"].ToString());
                    temp.companyName = reader["company_name"].ToString();
                }
                conn.Close();
            }

            return temp;
    }
}

我怎样才能以最有效的方式找回我的公司用户?
我是否需要在我的 DAL getUsersByCompanyID 中实现另一种方法,在那里我将传递我的 temp-object 并循环通过 SELECT * FROM person WHERE companyID = @companyID 检索到的行,还是有更好的方法?

【问题讨论】:

  • softID 对表中的每个公司都是唯一的吗?或者不止一家公司可以拥有相同的softID?
  • 每个公司都是独一无二的
  • 执行inner join,然后在执行阅读器时,将用户添加到Company 对象的列表中。应该很容易,因为您正在为该特定公司获取用户
  • 我相信您会希望将您的两个表连接在一起,然后遍历结果以构建您的用户列表。所以你的查询是: SELECT * FROM Company c JOIN User u ON c.CompanyID = u.CompanyID WHERE c.softID = @softID;

标签: c# sql oop object select


【解决方案1】:

一种相当简单的方法是使用将公司表和用户表连接在一起的查询:

public Company getCompany(int _softID)
{
    Company temp = new Company();

    conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Database"].ConnectionString);
    SqlCommand command = new SqlCommand(@"SELECT c.CompanyId, Company_Name, UserId, UserName 
                                          FROM company As c
                                          JOIN [User] As u ON c.CompanyId = u.CompanyId
                                          WHERE softID = @softID;", conn);
    command.Parameters.Add("@softID", SqlDbType.Int).Value = _softID;
    {
        conn.Open();
        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {
            temp.CompanyID = int.Parse(reader["companyID"].ToString());
            temp.companyName = reader["company_name"].ToString();
            temp.CompanyUsers.Add(new User()
                                  {
                                      UserID = int.Parse(reader["UserId"].ToString()),
                                      UserName = reader["UserName"].ToString()
                                  });
        }
        conn.Close();
    }
    return temp;
}

“缺点”是您不断地覆盖 CompanyIDcompanyName 属性,但以简单的方式执行此操作的代价非常小。

【讨论】:

  • 不需要+ 来连接select 语句,因为你有@,只是一件小事。
  • @penleychan 不错!我什至没有注意到@,只是从问题中复制了代码并进行了一些更改:-)。
【解决方案2】:

实体框架以有效的方式完成工作.....

实体框架 (EF) 是一种对象关系映射器,它使 .NET 开发人员能够使用特定于域的对象来处理关系数据。它消除了开发人员通常需要编写的大部分数据访问代码的需要。

实体框架允许您通过编写代码或使用 EF 设计器中的框和线来创建模型。这两种方法都可用于针对现有数据库或创建新数据库。这个简短的视频解释了这些差异以及如何找到适合您的。

Introduction to Entity Framework

【讨论】:

  • 实体框架以简单的方式完成这项工作。如果您熟悉 SQL,大多数情况下它不如自己编写 SQL 高效。如果您想要一个高效的 ORM,请使用 Dapper,尽管它是一个 Micro ORM,您必须了解使用 SQL 的方式才能使用它。
  • 我认为“有效方式”意味着“省力”??它使用起来非常简单,而几乎为零的配置......
  • 所以当您谈论effective way 时,您的真正意思是easy to write。我虽然你在谈论高效的运行时间,但这不是 EF 的强项(尽管我知道最新版本正在变得更好)
猜你喜欢
  • 2022-01-10
  • 2013-07-15
  • 2015-04-28
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2015-02-11
相关资源
最近更新 更多