从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还没有存在。
有更好的解决方案吗?
假设您有一个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方法,也可以满足你的要求。
假设数据库中有两个表。Person
和Cars
。为简单起见,假设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();
}