Dapper 또는 Linq를 사용하여 일대 다 관계를 채우기

c# dapper linq one-to-many

문제

엔티티 - AllSalesTerritory 는 일대 다 관계를 나타내는 List<MySalesPerson> 포함합니다. 두 엔터티가 TerritoryId 열을 사용하여 매핑되는 데이터를 가져 오기위한 Sql 쿼리가 있습니다. Dapper micro ORM 사용하여 엔티티를 채우기 위해 다음 코드를 사용합니다.

 List<AllSalesTerritory> allSalesTerrotories = _connection.Query<AllSalesTerritory, MySalesPerson, AllSalesTerritory>
                (query, (pd, pp) =>
                {
                    pd.SalesPersons.Add(pp);
                    return pd;
                }, splitOn: "BusinessEntityId")
                .ToList();

BusinessEntityId 는 Sql 문을 실행할 때 SalesPerson 엔터티의 시작 열입니다.

필자가 직면 한 문제는 이러한 종류의 코드가 일대일 릴레이션을 쉽게 채우는 데 도움이된다는 것입니다. 여기서는 컬렉션의 값을 집계하는 대신 List<MySalesPerson> 과 동일한 결과를 List<MySalesPerson> 대신 각 List<MySalesPerson> 에서 하나의 값만 얻습니다. 질문. 간단한 foreach 루프를 사용하고 MySalesPerson 의 값을 집계 MySalesPerson 문제를 쉽게 해결할 수 있습니다. 그러나, 나는 알아 내고 싶다 :

  1. Dapper가 자동으로 도움을 줄 수 있습니까? 몇 개의 확장 프로그램을 사용해 보았지만 예상대로 작동하지 않았습니다.
  2. Linq 코드는 일대 다 관계가있는 엔티티의 SelectMany 와 다소 반대이므로 저에게 도움이 될 수 있습니까?

수락 된 답변

사전을 사용하여 고유 한 AllSalesTerritory 개체를 추적 할 수 있습니다. TerritoryId 속성이 int 라고 가정하면이 속성이 작동합니다.

var territories = new Dictionary<int, AllSalesTerritory>()
_connection.Query<AllSalesTerritory, MySalesPerson, AllSalesTerritory>
    (query, (pd, pp) =>
    {
        AllSalesTerritory territory;
        if(!territories.TryGetValue(pd.TerritoryId, out territory))
        {
            territories.Add(pd.TerritoryId, territory = pd);
        }       

        territory.SalesPersons.Add(pp);
        return territory;
    }, splitOn: "BusinessEntityId");

List<AllSalesTerritory> allSalesTerrotories = territories.Values.ToList();

기본적으로 여기서 일어나는 일은 Dapper가 쿼리 결과의 각 행에 대해 하나의 AllSalesTerritoryMySalesPerson 을 반환한다는 것입니다. 그런 다음 사전을 사용하여 TerritoryId 를 기반으로 이전에 현재 AllSalesTerritory ( pd )가 표시되었는지 확인합니다. 그렇다면 지역 territory 변수에 해당 객체에 대한 참조가 지정됩니다. 그렇지 않다면 우리는 territory pd 를 할당 한 다음 사전에 추가합니다. 그런 다음 territory.SalesPersons MySalesPerson ( pp )을 MySalesPerson 목록에 추가하기 MySalesPerson 됩니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.