Dapper-dot-net "no column name"

4

我有一个结果集,可能看起来像这样:

ID    (no column name)  anotherID
----  ----------------  ----------
1        super            3
1        super            4
3        duper            6
4        really           7
4        really           8

我有两个问题:

第一个问题:我如何在没有名称的列中使用 Dapper?

第二个问题:我想要一个父子关系,例如,我想获得 3 个对象,每个对象都有另一个 ID 列表:

public class MyObject
{
   public int ID
   public string Name
   public int[] Children
}

抱歉,无法命名该列...不是我的数据库存储过程。 - John Sobolewski
参见:https://dev59.com/fGbWa4cB1Zd3GeqPY6aX - Marc Gravell
1个回答

4

很抱歉,Dapper不支持未命名的列。我从来没有真正看到过这样做的原因。

我想我们可以为以下内容构建支持:

class Foo { [ColumnNumber(1)] public string Name {get;set;} }

问题在于它引入了一种非常脆弱的查询方法,我强烈不喜欢传递一个指令给Query,这样做很笨重。

然而,如果你愿意改变获取结果的方式,你可以解决这个问题。

var grid = QueryMultiple(@"set nocount on 
declare @t table(Id int, Name nvarchar(max), AnotherId int)

insert @t
exec proc

set nocount off 
select Id, Name from @t
select Id, AnotherId from @t
");

然后使用这里的技术进行多重映射:使用多重映射创建对象层次结构

1
也许更好的方法是传递一个映射,给列指定名称,这样您可以将其作为查询的额外参数来指定,而不会混淆数据对象定义。特别是如果您将数据对象用于多个查询。或者,您还可以允许将名称重新映射到其他名称...例如,底层数据(存储过程)返回一堆匈牙利符号,您不希望在数据对象中出现。 - John Sobolewski
我和jsobo处境相同,我有一个存储过程,但我无法控制它...但需要在报告应用程序中使用具有多个未命名列的存储过程。我尝试调整查询,但我得到SQL错误“无法嵌套插入EXEC语句”。理想情况下,如果我可以引用列号,那么就可以解决我的问题。如何修改drapper以添加支持:类Foo { [ColumnNumber(1)] public string Name {get;set;} } - studiothat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接