Lösung 1:
Ich gehe davon aus, dass die Datensätze mit Namen in den Ergebnissen der SQL-Abfrage sortiert werden und dass Sie auch die customerID wählen. Das Anfügen von "ORDER BY customer.fName, customer.lName"
an Ihre ursprüngliche Abfrage wird den Trick tun.
Ich gehe davon aus, dass Sie Ihr Ergebnis in einem Datareader bekommen, so können Sie wie folgt vorgehen:
// 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);
}
}
P. S. Wenn das Bestellen der Liste keine Option ist, dann können Sie nicht nur die zuletzt hinzugefügten Datensätze von customer id überprüfen, sondern müssen stattdessen die myRecords-Liste durchlaufen und nach deren Existenz suchen. Dies kann auf viele Arten geschehen, einschließlich mit myRecords.Contains() oder mit einer foreach.
Lösung 2:
die Telefonnummer Sie direkt von SQL Gruppierung. Erstellen Sie eine Funktion zum Auswählen einer durch Komma getrennte Zeichenfolge mit allen Telefonnummern eines bestimmten Kunden:
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
Dann sind Sie schön die Liste aller Kunden auswählen können Sie wollen:
SELECT customerId, dbo.GetCommaSeparatedPhoneNumbers(customerId)
FROM Customers
GROUP BY customerId
Dies wird zurückkehren:
"John", "Smith", "111-111"
"Jane", "Doe", "222-1111,222-2222"
Jetzt ist es alles eine Frage der die Ergebnisse mit einer foreach oder while-Schleife Parsen, aber keine Prüfung für existance benötigt wird. Teilen Sie die Zeichenfolge einfach in ',' und fügen Sie die Werte in die Liste ein. Wenn es eine Chance gibt, dass es für einige Kunden keine Telefonnummern gibt, können Sie dieses Feld für null filtern.
PS. Funktioniert nicht, wenn ein Komma wie in BQ in seinem Kommentar angegeben ist.
Führen Sie ADO oder Linq aus? – guildsbounty
Woher weißt du, dass Jane Doe und Jane Doe nicht 2 getrennte Leute sind? –
Ich weiß, dass Jane Doe und Jane Doe die gleiche Person sind, weil dies ein künstliches Beispiel ist :-). Meine realen Daten sind komplizierter. –