我正在使用一种返回签名为IEnumerable<dynamic>
. 在特定调用的运行时,它正在返回List<Dapper.SqlMapper.FastExpando>
.
var x0 = repo.Find(proc, param);
//x0 runtime type is {List<Dapper.SqlMapper.FastExpando>}
LINQPad.Extensions.Dump
表示运行时类型x0
is:List<IDictionary<String, Object>>
但我似乎无法转换/转换为List<IDictionary<String, Object>>
. 这是 Linqpad 转储的屏幕截图:
最终,我需要将每个 Dictionary 中的所有 Values 加入到单个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)