首页 > 解决方案 > 如何处理从 LEFT JOIN 查询中选择的数据?

问题描述

我想执行一个查询,选择所有客户,以及每个客户的相应地址。每个客户可以有零个、一个或多个地址。

这是我尝试过的:

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

我在互联网上找不到任何解释您可以访问每个客户的选定地址的方式。

有人可以解释一下,或者给我看一个代码示例吗?

标签: c#sql.netsql-serverdatabase

解决方案


您应该过滤属于循环中当前客户的客户的地址

你甚至可以使用一个if子句来cust.Id比较row.Field<int>("CustomerId")


推荐阅读