我有一个带有左连接的存储过程,它返回如下内容:
name1 car1
name1 car2
name1 car3
name2 car1
name3 null
name4 null
我需要将此结果存储在这样的对象中:
class Person
{
string Name;
List<string> Cars;
}
做这个的最好方式是什么?直接在存储过程中或在检索查询结果后的代码中。
我现在做的是,一旦我得到db的结果迭代它并将名称及其汽车列表c#添加到另一个对象(如果名称尚未存在)。
有更好的解决方案吗?
假设您的数据库中有两个表。 Person
与Cars
。为简单起见,假设Person有两列PersonID, Name
,而Cars有三列CarID, Name, PersonID
。 Cars表中的字段PersonID是将汽车链接到人的外键。
将您的人员与您的汽车相关联的简单查询是
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();
}