【问题标题】:Map a column with string representing a list to a List<> object using Dapper使用 Dapper 将带有表示列表的字符串的列映射到 List<> 对象
【发布时间】:2016-04-28 00:31:26
【问题描述】:

我有以下型号:

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&lt;Model&gt;

我知道我可以使用多重映射并在 C# 代码中自己进行拆分,但我宁愿得到一个更简单的解决方案。

【问题讨论】:

    标签: sql-server split dapper


    【解决方案1】:

    多重映射的替代选项...非常丑陋

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

    【讨论】:

      【解决方案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));
          }
      }
      

      【讨论】:

      • 如果你的选择中有超过七列,你怎么办??*
      猜你喜欢
      • 2018-08-06
      • 2019-01-31
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 2011-11-22
      • 2020-11-28
      相关资源
      最近更新 更多