C# 如何将两个SQL表中的数据获取到.net中

C# 如何将两个SQL表中的数据获取到.net中,c#,.net,sql,C#,.net,Sql,之前,我问了一个关于从两个表中获取数据的问题,在这两个表中,我在一个表中获取一行,并将其与另一个表中的几行连接起来。以下是该讨论的链接: 以下是我的SQL代码: SELECT customer.fName, customer.lName, phone.phoneNumber FROM Customers customer INNER JOIN phoneNumbers phone ON customer.customerId =

之前,我问了一个关于从两个表中获取数据的问题,在这两个表中,我在一个表中获取一行,并将其与另一个表中的几行连接起来。以下是该讨论的链接:

以下是我的SQL代码:

SELECT 
    customer.fName, customer.lName, phone.phoneNumber 
FROM 
    Customers customer 
        INNER JOIN phoneNumbers phone ON 
            customer.customerId = phone.customerId
我现在想知道的是:在.net中组织这些数据的最佳方法是什么

假设我有一个C类,如下所示:

public class CustomerDetails
{
    int customerId;
    string fname;
    string lName;
    List<string> phoneNumbers;
}
// Lets start by declaring a collection for our records
List<CustomerDetails> myRecords = new List<CustomerDetails>();

// Iterate all records from the results and fill our collection
while (yourReader.Read())
{
    int customerID = int.Parse(yourReader["customerID"]);
    int nrRecords = myRecords.Count;

    if (nrRecords > 0 && myRecords[nrRecords - 1].customerId == customerID)
    {
        myRecords[nrRecords - 1].phoneNumbers.Add(yourReader["phoneNumber"]);
    }
    else
    {
        CustomerDetails newCustomerDetails = new CustomerDetails();
        newCustomerDetails.customerId = customerID;
        newCustomerDetails.fName = yourReader["fName"];
        newCustomerDetails.lName = yourReader["lName"];

        List<string> phoneNumberList = new List<string>();
        phoneNumberList.Add(yourReader["phoneNumber"]);
        newCustomerDetails.phoneNumbers = phoneNumberList;

        myRecords.Add(newCustomerDetails);
    }
}
为了便于讨论,假设上述SQL查询返回以下结果:

fname,lname,phoneNumber 约翰,史密斯,111-111 简,多伊,222-1111 简,多伊,222-2222


乍一看,我发现我有两个客户;一个有一个电话号码,另一个有两个电话号码。如何编写代码以在C中高效地解析它?

一个选项是使用LINQ创建CustomerDetails类的实例

如果你想举个例子,请告诉我

例1:

例2:


一个选项是使用LINQ创建CustomerDetails类的实例

如果你想举个例子,请告诉我

例1:

例2:


迭代结果,对于每一行,检查它是否在客户列表中,如果不在,则添加一个新的,如果是,则将电话号码添加到现有的


当然,您不应该解析字符串,使用适当的类访问数据库,如ado.net。

迭代结果,每行检查它是否在您的客户列表中,如果不在,添加一个新的,如果是,将电话号码添加到现有的


当然,您不应该像ado.net那样使用适当的类来访问数据库来解析字符串。

我知道您正在寻找ORM对象关系映射。在.NET中,我可以推荐IBatis.NET或LINQ。

我知道您正在寻找ORM对象关系映射。在.NET中,我可以推荐IBatis.NET或LINQ。

解决方案1: 我假设记录在SQL查询结果中按名称排序,并且您还选择了customerID。将ORDER BY customer.fName、customer.lName追加到原始查询即可

我假设您在DataReader中获得结果,因此您可以执行以下操作:

public class CustomerDetails
{
    int customerId;
    string fname;
    string lName;
    List<string> phoneNumbers;
}
// Lets start by declaring a collection for our records
List<CustomerDetails> myRecords = new List<CustomerDetails>();

// Iterate all records from the results and fill our collection
while (yourReader.Read())
{
    int customerID = int.Parse(yourReader["customerID"]);
    int nrRecords = myRecords.Count;

    if (nrRecords > 0 && myRecords[nrRecords - 1].customerId == customerID)
    {
        myRecords[nrRecords - 1].phoneNumbers.Add(yourReader["phoneNumber"]);
    }
    else
    {
        CustomerDetails newCustomerDetails = new CustomerDetails();
        newCustomerDetails.customerId = customerID;
        newCustomerDetails.fName = yourReader["fName"];
        newCustomerDetails.lName = yourReader["lName"];

        List<string> phoneNumberList = new List<string>();
        phoneNumberList.Add(yourReader["phoneNumber"]);
        newCustomerDetails.phoneNumbers = phoneNumberList;

        myRecords.Add(newCustomerDetails);
    }
}
然后,您可以很好地选择您想要的所有客户的列表:

SELECT customerId, dbo.GetCommaSeparatedPhoneNumbers(customerId)
FROM Customers 
GROUP BY customerId
这将返回:

"John", "Smith", "111-111"
"Jane", "Doe", "222-1111,222-2222"
现在所有的问题都是使用foreach或while循环解析结果,但不需要检查是否存在。只需在“,”处拆分字符串,并将值插入列表。如果某些客户可能没有电话号码,那么您可以将该字段过滤为空

如果在他的评论中指出有逗号,则PS.将不起作用。

解决方案1: 我假设记录在SQL查询结果中按名称排序,并且您还选择了customerID。将ORDER BY customer.fName、customer.lName追加到原始查询即可

我假设您在DataReader中获得结果,因此您可以执行以下操作:

public class CustomerDetails
{
    int customerId;
    string fname;
    string lName;
    List<string> phoneNumbers;
}
// Lets start by declaring a collection for our records
List<CustomerDetails> myRecords = new List<CustomerDetails>();

// Iterate all records from the results and fill our collection
while (yourReader.Read())
{
    int customerID = int.Parse(yourReader["customerID"]);
    int nrRecords = myRecords.Count;

    if (nrRecords > 0 && myRecords[nrRecords - 1].customerId == customerID)
    {
        myRecords[nrRecords - 1].phoneNumbers.Add(yourReader["phoneNumber"]);
    }
    else
    {
        CustomerDetails newCustomerDetails = new CustomerDetails();
        newCustomerDetails.customerId = customerID;
        newCustomerDetails.fName = yourReader["fName"];
        newCustomerDetails.lName = yourReader["lName"];

        List<string> phoneNumberList = new List<string>();
        phoneNumberList.Add(yourReader["phoneNumber"]);
        newCustomerDetails.phoneNumbers = phoneNumberList;

        myRecords.Add(newCustomerDetails);
    }
}
然后,您可以很好地选择您想要的所有客户的列表:

SELECT customerId, dbo.GetCommaSeparatedPhoneNumbers(customerId)
FROM Customers 
GROUP BY customerId
这将返回:

"John", "Smith", "111-111"
"Jane", "Doe", "222-1111,222-2222"
现在所有的问题都是使用foreach或while循环解析结果,但不需要检查是否存在。只需在“,”处拆分字符串,并将值插入列表。如果某些客户可能没有电话号码,那么您可以将该字段过滤为空


如果他在评论中指出有逗号,那么PS.将不起作用。

你是用ADO还是Linq执行?你怎么知道Jane doe和Jane doe不是两个独立的人?我知道Jane doe和Jane doe是同一个人,因为这是一个人为的例子:-。我的真实数据更复杂。你是用ADO还是Linq执行?你怎么知道Jane doe和Jane doe不是两个独立的人?我知道Jane doe和Jane doe是同一个人,因为这是一个人为的例子:-。我的真实数据更复杂。我实际上已经编写了一些代码来进行迭代,但它似乎过于臃肿和笨拙。我希望有一种更高效、更干净的方法。我实际上已经编写了一些代码来进行迭代,但它似乎过于臃肿和笨拙。我希望有一种更有效、更干净的方法。这个答案假设电话号码不包含逗号。逗号通常用于表示拨分机号码前暂停2秒。此外,没有理由合并数据库中要返回的记录。-1。这个答案假设电话号码不包含逗号。逗号通常用于表示拨分机号码前暂停2秒。此外,没有理由合并数据库中要返回的记录。