解決方案1:
我假定記錄由在SQL查詢的結果名稱排序,您還要選擇在客戶。將"ORDER BY customer.fName, customer.lName"
附加到您的原始查詢將會有所斬獲。
我假設你得到的結果在一個DataReader,這樣你就可以做到以下幾點:
// 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);
}
}
附:如果訂購該清單不是一個選項,那麼您不能只檢查最新添加的記錄customerid - 而是需要遍歷myRecords列表並搜索它的存在。這可以通過許多方式完成,包括使用myRecords.Contains()或foreach。
解決方案2:
做的電話號碼直接從SQL分組。選擇一個逗號分隔的字符串與特定客戶的所有電話號碼創建一個功能:
CREATE FUNCTION [dbo].[GetCommaSeparatedPhoneNumbers]
(
@customerID int
)
RETURNS varchar(max)
AS
BEGIN
declare @output varchar(max)
select @output = COALESCE(@output + ', ', '') + phoneNumbers
from phoneNumbers
where customerId = @customerID
return @output
END
GO
然後你就可以很好地選擇所有客戶的列表中選擇所需:
SELECT customerId, dbo.GetCommaSeparatedPhoneNumbers(customerId)
FROM Customers
GROUP BY customerId
這將返回:
"John", "Smith", "111-111"
"Jane", "Doe", "222-1111,222-2222"
現在,它的解析與一個foreach或while循環的結果的所有問題,但需要對所有腦幹任何檢查。只需將字符串拆分爲','並將值插入列表中。如果有機會,某些客戶將沒有電話號碼,則可以將該字段過濾爲空。
PS。如果在他的評論中有BQ指出的逗號,將不起作用。
您是由ADO還是Linq執行? – guildsbounty 2010-12-09 15:23:00
你怎麼知道Jane Doe和Jane Doe不是兩個獨立的人? – 2010-12-09 16:02:17
我知道Jane Doe和Jane Doe是同一個人,因爲這是一個人爲的例子:-)。我的真實數據更復雜。 – 2010-12-09 17:16:06