Sql server 将包含表示列表的字符串的列映射到列表<&燃气轮机;使用整洁的对象

Sql server 将包含表示列表的字符串的列映射到列表<&燃气轮机;使用整洁的对象,sql-server,dapper,string-split,dapper-extensions,Sql Server,Dapper,String Split,Dapper Extensions,我有以下型号: public class Model { public string Name { get; set; } public List<int> Numbers { get; set; } } 是否有一种简单的方法可以使用Dapper将查询结果自动分配到列表 我知道我可以使用多重映射,自己在C代码中进行拆分,但我更希望得到一个更简单的解决方案。我不确定是否可以称之为“更简单”,但类似这样的选项是: public class Result { publ

我有以下型号:

public class Model {
   public string Name { get; set; }
   public List<int> Numbers { get; set; }
}
是否有一种简单的方法可以使用
Dapper
将查询结果自动分配到
列表


我知道我可以使用多重映射,自己在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));
    }
}
公共类结果
{
公共字符串名称{get;set;}
公共列表编号{get;set;}
}
公共类测试
{
[测试]
公开无效测试()
{
var conn=new SqlConnection(@“数据源=。\sqlexpress;集成安全性=true;初始目录=mydb”);
conn.Open();
var结果=连接查询(
“选择名称='Foo',数字='1,2,3'联合所有选择名称='Bar',数字='4,5,6'”(a,b)=>新结果
{
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,大于(0));
Assert.That(result.FirstOrDefault(x=>x.Name==“Bar”).Numbers.Count,大于(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));
    }
}
公共类结果
{
公共字符串名称{get;set;}
公共列表编号列表{get;set;}
公共字符串编号{set{NumberList=value.Split(',).Select(Int32.Parse.ToList();}
}
公共类测试
{
[测试]
公开无效测试()
{
var conn=new SqlConnection(@“数据源=。\sqlexpress;集成安全性=true;初始目录=mydb”);
conn.Open();
var sql=@”
选择名称='Foo',数字='1,2,3';
选择名称='Bar',数字='4,5,6';“;
var expectedResults=2;
var results=新列表();
使用(var multi=conn.QueryMultiple(sql))
{
for(int i=0;ix.Name==“Foo”).NumberList.Count,比(0)大);
Assert.That(results.FirstOrDefault(x=>x.Name==“Bar”).NumberList.Count,大于(0));
}
}

如果您的select中有七列以上,您怎么做*
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));
    }
}