C# 从共享相同外键的不同列读取多行 SQL

C# Read multiple rows from different columns sharing same Foreign key SQL

我想要一种有效的方法来检索 table 中共享相同外键的所有信息,并将数据存储在 list/array.

我可以从一列读取多行:

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

int idForeignKey = inputIdFkey //Implemented on the WebPage for testing purposes

List<string> result = new List<string>();
string oString = "Select Column from Table where foreignKey = @fKey";

conn.Open();
SqlCommand oCmd = new SqlCommand(oString, conn);
oCmd.Parameters.AddWithValue("@fKey", idForeignKey);
using (SqlDataReader oReader = oCmd.ExecuteReader())
{
    while (oReader.Read())
    {
        result.Add(oReader.GetString(0));
    }
}
conn.Close();

如果我针对一个特定的行,我可以阅读多个专栏:

int sqlData1;
int sqlData2;
int sqlData3;

string oString = "Select * from Table where TableID = @tId";
SqlCommand oCmd = new SqlCommand(oString, conn);
oCmd.Parameters.AddWithValue("@tId", 1001);
conn.Open();
using (SqlDataReader oReader = oCmd.ExecuteReader())
{
    while (oReader.Read())
    {
        sqlData1 = oReader["Row1"].ToString();
        sqlData2 = oReader["Row2"].ToString();
        sqlData3 = oReader["Row3"].ToString();
    }
}
conn.Close();

但我希望能够读取具有相同外键的 all/specific 数据。所以我希望能够检索多行,将它们保存到列表中,并从共享相同外键的不同列中检索其他几行数据。

我想象它是这样的:

int idForeignKey = inputIdFkey //Implemented on the WebPage for testing purposes

List<int> intList = new List<int>();
List<string> stringList = new List<string>();
List<DateTime> dateList = new List<DateTime>();

string oString = "Select * from Table where ForeignKey = @fKey";

conn.Open();
SqlCommand oCmdSleep = new SqlCommand(oString, conn);
oCmdSleep.Parameters.AddWithValue("@fKey", idForeignKey);
using (SqlDataReader oReader = oCmdSleep.ExecuteReader())
{
    while (oReader.Read())
    {
        intList.Add(oReader["Column1"].GetDateTime(0));
        dstringList.Add(oReader["Column3"].GetDateTime(0));
        dateList.Add(oReader["Column4"].GetDateTime(0));
    }
}
conn.Close();

但这行不通...请多多指教

如果您使用 Dapper 之类的东西,它将简化将您的查询结果映射到 List<T>.

使用 nuget 将 Dapper 添加到您的项目中。

Install-Package Dapper -Version 1.50.5

在 class 查询的顶部添加 using for Dapper。

using Dapper;

添加与您的查询结果结构相匹配的 class。有多种方法可以使用脚本或实用程序来执行此操作。 Here's an app for that.

public class MyClass
{
    public int MyId { get; set; }
    public string MyName { get; set; }
    public DateTime MyDateTime { get; set; }
}

那么你 运行 查询就是这样做的。

using (conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
   var MyList = conn.Query<MyClass>(@"select * from Table where ForeignKey = @fKey", 
       new { fKey = "SomeKey" }).ToList();
}

一旦查询 运行s,您就可以遍历 MyList。

foreach (var myItem in MyList)
{
    // Do something with myItem
}

如果要绑定结果,只需从查询末尾删除 .ToList(),因为其默认值为 IObservable<T>

无需给出列名,直接使用已经建立的索引即可:

int idForeignKey = inputIdFkey //Implemented on the WebPage for testing purposes

List<int> intList = new List<int>();
List<string> stringList = new List<string>();
List<DateTime> dateList = new List<DateTime>();

string oString = "Select * from Table where ForeignKey = @fKey";

conn.Open();
SqlCommand oCmdSleep = new SqlCommand(oString, conn);
oCmdSleep.Parameters.AddWithValue("@fKey", idForeignKey);
using (SqlDataReader oReader = oCmdSleep.ExecuteReader())
{
    while (oReader.Read())
    {
        intList.Add(oReader.GetDateTime(0));
        dstringList.Add(oReader.GetDateTime(3));
        dateList.Add(oReader.GetDateTime(4));
    }
}
conn.Close();

细目如下:

listVariable.Add(oReader.GetDataType("Index of column"));

通过这种方式,您可以检索共享外键的所有行数据,并可以根据需要检索任意数量的列。