Как обрабатывать выбранные данные из запроса LEFT JOIN? - PullRequest
0 голосов
/ 15 мая 2018

Я хочу выполнить запрос, который выбирает всех клиентов и соответствующие адреса для каждого клиента.Каждый клиент может иметь ноль, один или несколько адресов.

Это то, что я пробовал:

sql = "SELECT customers.*, addresses.* FROM customers LEFT JOIN addresses ON addresses.CustomerId = customers.Id ORDER BY customers.Id OFFSET @start ROWS FETCH NEXT @end ROWS ONLY";

List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@start", limitStart));
parameters.Add(new SqlParameter("@end", limitEnd));
DataSet set = Db.ExecuteSelectQuery(sql, parameters);


DataTable table = set.Tables["customers"];

Console.WriteLine("Tables count: " + set.Tables.Count); // says there's 1 table.

List<Customer> customers = new List<Customer>();

foreach(DataRow row in table.Rows)
{
    Customer cust = new Customer();
    cust.Id = row.Field<int>("Id");
    cust.ClientNumber = row.Field<string>("clientnumber");
    cust.Date = DateTime.Parse(row.Field<string>("date"));
    cust.Firstname = row.Field<string>("firstname");
    cust.Insertion = row.Field<string>("insertion");
    cust.Lastname = row.Field<string>("lastname");

    foreach(DataRow addrRow in /* ......?...... */) // Want to loop through addresses of the current customer row.
    {
        Address address = new Address();
        address.Street = addrRow.Field<string>("Street");
        address.HouseNumber = addrRow.Field<string>("Number");
        address.PostalCode = addrRow.Field<string>("PostalCode");
        address.City = addrRow.Field<string>("City");
        address.Country = 0;// row.Field<int>("CountryCode");

        cust.Addresses.Add(address);
    }

    customers.Add(cust);
}

return customers;

Проблема в том, что я не знаю, как обработать результат запроса с использованиемDataTable и DataSet классы SqlClient.

Я не могу найти в Интернете ничего, объясняющего, как вы можете получить доступ к выбранным адресам для каждого клиента.

Может кто-нибудь объяснить мне или, может быть, показать мне пример кода?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

вы можете использовать библиотеку linq во втором для каждого

 foreach(DataRow addrRow in /* ......?...... */) // Want to loop through addresses of the current customer row.
{

Вот так:

foreach(DataRow addrRow in table.Rows.Where(x=>x.Field<int>("Id")==cust.Id)) // Want to loop through addresses of the current customer row.
{

Ваш код будет по-прежнему генерировать дубликаты записей о клиентах в вашем списке клиентов, поэтому, возможно, добавьте условие в начало первого цикла foreach:

foreach(DataRow row in table.Rows)
{
  if(customers.Where(x=>x.Id == row.Field<int>("Id").Any())continue;
0 голосов
/ 15 мая 2018

Вы должны отфильтровать адреса, принадлежащие клиенту, который является текущим клиентом в цикле

Вы даже можете использовать предложение if для сравнения cust.Id с row.Field<int>("CustomerId")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...