【问题标题】:How to get values from multiple columns as IEnumerable using SqlKata (Dapper)如何使用SqlKata(Dapper)从多个列中获取值作为IEnumerable
【发布时间】:2020-10-04 13:32:51
【问题描述】:

我正在使用 SQL,并且我的数据库中有一个如下所示的表。

Id   Remark1    Remark2    Remark3    Remark4    
------------------------------------------------
1    AAA        BBB        CCC        DDD      
2    EEE        FFF        GGG        HHH   

如何使用以下 DTO 将 Remark* 列中的所有值作为 IEnumerable<string> 获取?

class MyDTO
{
   public int ID { get; }
   public IEnumerable<string> Remarks { get; }
}

注意:我使用的是 SqlKata (Dapper),你也可以在回答时使用它。

【问题讨论】:

  • 您是希望仅将这 4 列映射到一个集合,还是您的实际用例需要处理更多列?
  • @John H 我的实际表有 50 个Remark 列!
  • 你在使用 SqlServer 吗?
  • @amd 我正在使用 Microsoft SQL Server。

标签: c# sql dapper sqlkata


【解决方案1】:

如果您使用 Dapper,也许只使用非通用查询 API。这会将每一行返回为dynamic,但这也可以转换为IDictionary&lt;string,object&gt;,这样您就可以访问每个命名列(例如,通过foreach)。

foreach (IDictionary<string, object> row in conn.Query(sql, args))
{
    var obj = new MyDto();
    var vals = new List<string>();
    obj.Remarks = list;
    foreach ((var key, var value) in row)
    {
        if (key == nameof(obj.Id))
            obj.Id = (int)value;
        else
            vals.Add((string)value);
    }
    // do something with obj
}
```

【讨论】:

  • 非常感谢您的帮助。这几乎正​​是我一直在寻找的。​​span>
【解决方案2】:

另一种选择是创建一个外观丑陋但有效的 UNION ALL 查询:

SELECT Id, Remark1 as Remark FROM Table
UNION ALL
SELECT Id, Remark2 as Remark FROM Table
UNION ALL
SELECT Id, Remark... as Remark FROM Table

这可以使用 SqlKata 在 for..loop 中完成,在循环中调用 Union

https://sqlkata.com/docs/combine#union-except-intersect

未经测试的代码示例:

var q = new Query("Table").Select("Id", "Remark1 as Remark");
for(int r=2;r<=50;i++)
{
  var u = new Query("Table").Select("Id", $"Remark{r} as Remark");
  q = q.Union(u);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多