【问题标题】:Return array from db?从数据库返回数组?
【发布时间】:2015-09-11 05:21:02
【问题描述】:

我有一个带有左连接的存储过程,它返回如下内容:

name1  car1
name1  car2
name1  car3
name2  car1
name3  null
name4  null

我需要将此结果存储在这样的对象中:

class Person 
{
    string Name;
    List<string> Cars;
}

最好的方法是什么?直接在存储过程中,或者在检索查询结果后在代码中。

我现在要做的是,一旦我获得了 db 的结果,就可以对其进行迭代,并将名称及其汽车 c# 列表添加到另一个对象(如果名称尚不存在)。

有没有更好的解决方案?

【问题讨论】:

  • 您使用什么数据访问技术?你能提供一些你如何执行存储过程的代码吗?
  • 我正在使用 Dapper,像这样调用它 var queryResult = PersonRepo.ExecuteQuery("dbo.GetPersonsCars", null, CommandType.StoredProcedure).ToList()。 PersonInfo 类类似于上面列出的 Person 类,但 Cars 不是列表,而是简单的字符串。所以我必须创建 2 个类..

标签: c# sql-server dapper


【解决方案1】:

假设您有一个 DataReader 返回连接结果,我会这样做:

        Dictionary<string, List<string>> people = new Dictionary<string, List<string>>();
        while (reader.Read())
        {
            string name = reader.GetString(0);
            string car = reader.GetString(1);
            List<string> cars = null;
            if (!people.TryGetValue(name, out cars))
            {
                people[name] = cars = new List<string>();
            }
            if (null != car)
                cars.Add(car);
        }

每个字典键/值对代表一个人。但是,如果您仍然需要它们,您现在可以从字典条目中创建 Person 实例。我只会使用字典来访问人和他们的汽车。

【讨论】:

    【解决方案2】:

    我会编写一个更可重用的 DataAccess 类,它总是返回一个IEnumerable&lt;T&gt;。根据您的要求,您可能/可能不想调用 .ToList() 来强制枚举。

    然后你可以做任何你想做的事情,比如将IEnumerable&lt;T&gt;转换为你需要的任何东西,比如IDictionary&lt;string, List&lt;string&gt;&gt;,或者使用.GroupBy() LINQ方法,它也可以满足你的要求。

    你有选择,这是肯定的。

    【讨论】:

      【解决方案3】:

      假设您的数据库中有两个表。 PersonCars。 为简单起见,假设 Person 有两列 PersonID, Name,而 Cars 有三列 CarID, Name, PersonID。 Cars 表中的 PersonID 字段是将汽车与人联系起来的外键。

      将您的 Person 与您的 Car 相关联的简单查询是

      string query = @"
      SELECT p.PersonID, p.Name, c.CarID, c.Name 
      FROM Person p LEFT JOIN Cars c on p.PersonID = c.PersonID";
      

      这可能是你的模型

      public class Person
      {
          public int PersonID {get;set;}
          public string Name { get; set; }
          public List<Car> Cars {get;set;}
      }
      public class Car
      {
          public int CarID { get; set; }
          public string Name { get; set; }
          public int PersonID {get;set;}
      }
      

      现在你可以编写这个来使用 Dapper

      var lookup = new Dictionary<int, Person>();
      using (IDbConnection cnn = GetOpenConnection())
      {
          var people = cnn.Query <Person, Car, Person>(query, (per, car) =>
          {
              Person found;
              if (!lookup.TryGetValue(per.PersonID, out found))
              {
                  found = per;
                  lookup.Add(per.PersonID, found);
                  found.Cars = new List<Car>();
              }
              found.Cars.Add(car);
              return found;
          }, splitOn: "CarID").Distinct();
      }
      

      【讨论】:

        猜你喜欢
        • 2015-04-06
        • 2020-04-17
        • 2019-01-26
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 2013-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多