db에서 배열을 반환 하시겠습니까?

c# dapper sql-server

문제

나는 이런 식으로 리턴하는 왼쪽 조인을 가진 저장 프로 시저를 가지고있다.

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

이 결과를 다음과 같은 객체에 저장해야합니다.

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

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 저장 프로 시저에서 직접 또는 쿼리 결과를 검색 한 후 코드에서.

이제는 DB에서 반복 결과를 얻고 이름이 이미 없으면 다른 객체에 이름과 그 목록을 추가합니다.

이보다 더 좋은 해결책이 있습니까?

인기 답변

데이터베이스에 두 개의 테이블이 있다고 가정하십시오. PersonCars . 단순성을 위해 Person은 PersonID, Name 이라는 두 개의 열을 가지고 있다고 가정하고, Cars는 CarID, Name, PersonID 세 개의 열 CarID, Name, PersonID . Cars 테이블의 PersonID 필드는 자동차를 사람과 연결시키는 foreing 키입니다.

사람과 자동차를 연결시키는 간단한 쿼리는

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();
}


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow