gpt4 book ai didi

c# - 如何将 List 转换为运行时类型 (List>)

转载 作者:行者123 更新时间:2023-11-30 20:58:30 26 4
gpt4 key购买 nike

我正在使用一个返回签名为 IEnumerable<dynamic> 的方法.在特定调用的运行时,它返回 List<Dapper.SqlMapper.FastExpando> .

var x0 = repo.Find(proc, param); 
//x0 runtime type is {List<Dapper.SqlMapper.FastExpando>}

LINQPad.Extensions.Dump表示 x0 的运行时类型是:List<IDictionary<String, Object>>但我似乎无法转换/转换为 List<IDictionary<String, Object>> .这是 Linqpad 转储的屏幕截图: enter image description here

最终我需要将每个字典中的所有值连接到单个 IEnumerable<DateTime> .

IEnumerable<DateTime> GetDates(int productId) 
{
const string proc = "[dbo].[myproc]";
dynamic param = new { Id = "asdf" };
var x0 = repo.Find(proc, param);
//...
//linq conversion from x0 to IEnumerable<DateTime> here.
}

我收到错误

List<IDictionary<String, Object>> x5 = repo.Find(proc, param);

结果:

RuntimeBinderException: Cannot implicitly convert type 'object' to
'System.Collections.Generic
.List<System.Collections.Generic.IDictionary<string,object>>'.
An explicit conversion exists (are you missing a cast?)

背景:我正在使用 Dapper包装器,并且不能更改返回非规范化结果的数据库表/存储过程。存储过程返回 1 行 100 列,而不是 100 行 1 个数据元素。我想避免创建一个类来表示 100 列,并想利用 Dapper通过 columnName、columnValue 的 IDictionary 将列数据转换为行的自动魔法能力。

更新这似乎是动态参数的问题。当指定内联时,它会起作用。如果在本地指定,然后作为参数传递,则失败。

IEnumerable<DateTime> GetDates(int productId) 
{
const string proc = "[dbo].[myproc]";
dynamic param = new { Id = "asdf" };

//next line throws RuntimeBinderException: 'object' does not
//contain a definition for 'First'.
//IDictionary<String, object> x0 = repo.Find(proc, param).First();

//this succeeds:
IDictionary<String, object> x0 = repo.Find(proc, new { Id = "asdf" }).First();

IEnumerable<DateTime> qry2
= x0.Values.AsQueryable()
.Where(x => x != null)
.Select(x => (DateTime) x);
return qry2;
}

这里是 Find 的签名和 Query :

//Repository::Find
public IEnumerable<dynamic> Find(string procName, object param = null)

//Dapper SqlMapper::Query
public static IEnumerable<dynamic> Query(this IDbConnection cnn, string sql, dynamic param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null)

最佳答案

您可以使用 LINQ Cast 方法来转换序列中的每个项目。

List<IDictionary<String, Object>> data = repo.Find(proc, param)
.AsEnumerable()
.Cast<IDictionary<String, Object>>()
.ToList();

关于c# - 如何将 List<Dapper.SqlMapper.FastExpando> 转换为运行时类型 (List<IDictionary<string,object>>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16066779/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com