从db返回数组

本文关键字:数组 返回 db | 更新日期: 2023-09-27 18:12:25

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

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

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

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

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

我现在做的是,一旦我从db得到结果,迭代它,并将名称和它的汽车列表c#添加到另一个对象,如果name还没有存在。

有更好的解决方案吗?

从db返回数组

假设您有一个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。但是,如果仍然需要的话,现在可以从字典条目创建Person的实例。我只会使用字典来访问人和他们的车。

我会编写一个更可重用的DataAccess类,它总是返回一个IEnumerable<T>。根据您的需求,您可能希望/可能不希望调用.ToList()来强制枚举。

然后你可以做任何你想做的,比如把IEnumerable<T>转换成你需要的任何东西,比如IDictionary<string, List<string>>,或者也许使用.GroupBy() LINQ方法,也可以满足你的要求。

假设数据库中有两个表。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();
}