Dapper를 사용하여 목록을 나타내는 문자열로 된 열을 List <> 객체에 매핑합니다.

dapper dapper-extensions sql-server string-split

문제

나는 다음 모델을 가지고있다 :

public class Model {
   public string Name { get; set; }
   public List<int> Numbers { get; set; }
}

그리고 두 개의 nvarchar 열을 포함하는 다음 데이터 집합을 반환하는 SQL 쿼리 :

 Name |  Numbers
'foo' | '1,2,3,4'
'bar' | '4,17'

Dapper 사용하여 List<Model> 쿼리 결과를 자동으로 할당하는 간단한 방법이 있습니까?

다중 매핑을 사용하여 C # 코드로 나눌 수 있다는 것을 알고 있지만, 더 간단한 솔루션을 얻고 싶습니다.

수락 된 답변

나는 이것을 "더 간단하다"라고 부를 수 있는지 확신하지 못한다. 그러나 이것과 같은 것은 선택 사항이다.

public class Result
{
    public string Name { get; set; }
    public List<int> Numbers { get; set; }
}
public class DapperTests
{
    [Test]
    public void Test()
    {
        var conn = new SqlConnection(@"Data Source=.\sqlexpress; Integrated Security=true; Initial Catalog=mydb");

        conn.Open();

        var result = conn.Query<string, string, Result>(
                    "select Name = 'Foo', Numbers = '1,2,3' union all select Name = 'Bar', Numbers = '4,5,6'", (a, b) => new Result
                    {
                        Name = a,
                        Numbers = b.Split(',').Select(Int32.Parse).ToList()
                    }, splitOn: "*").ToList();

        Assert.That(result.Count, Is.EqualTo(2));
        Assert.That(result.FirstOrDefault(x => x.Name == "Foo").Numbers.Count, Is.GreaterThan(0));
        Assert.That(result.FirstOrDefault(x => x.Name == "Bar").Numbers.Count, Is.GreaterThan(0));
    }
}

인기 답변

멀티 매핑을 사용한 대체 옵션 ... 꽤 못생긴

public class Result
{
    public string Name { get; set; }
    public List<int> NumberList { get; set; }
    public string Numbers { set { NumberList = value.Split(',').Select(Int32.Parse).ToList(); } }
}

public class DapperTests
{
    [Test]
    public void Test()
    {
        var conn = new SqlConnection(@"Data Source=.\sqlexpress; Integrated Security=true; Initial Catalog=mydb");

        conn.Open();

        var sql = @"
            select Name = 'Foo', Numbers = '1,2,3';
            select Name = 'Bar', Numbers = '4,5,6';";

        var expectedResults = 2;

        var results = new List<Result>();
        using (var multi = conn.QueryMultiple(sql))
        {
            for (int i = 0; i < expectedResults; i++)
            {
                results.Add(multi.Read<Result>().Single());
            }
        }

        Assert.That(results.Count, Is.EqualTo(2));

        Assert.That(results.FirstOrDefault(x => x.Name == "Foo").NumberList.Count, Is.GreaterThan(0));
        Assert.That(results.FirstOrDefault(x => x.Name == "Bar").NumberList.Count, Is.GreaterThan(0));
    }
}


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