C# 如何将两个SQL表中的数据获取到.net中
之前,我问了一个关于从两个表中获取数据的问题,在这两个表中,我在一个表中获取一行,并将其与另一个表中的几行连接起来。以下是该讨论的链接: 以下是我的SQL代码: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 =
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秒。此外,没有理由合并数据库中要返回的记录。