2016-01-21 34 views
3

一個列表<>對象的列我有以下模式:地圖字符串代表一個列表,以使用了Dapper

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

而一個SQL查詢,返回含有兩個nvarchar列下列數據集:

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

是否有一個簡單的方法來使用Dapper自動分配查詢結果到List<Model>

我知道我可以使用多重映射,並使自己在C#代碼分裂,但我寧願得到一個更簡單的解決方案。

回答

2

我不知道,如果你可以調用這個「簡單」,但這樣的事情是一個選項:

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

與multimapping另外一種方式......很醜

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)); 
    } 
} 
相關問題