如何使用 ExecuteStoreQuery 选择不同数量的列
本文关键字:何使用 ExecuteStoreQuery 选择 | 更新日期: 2023-09-27 18:30:56
我正在动态构建一个具有不同列数的选择查询。
select
a as col0,
b as col1,
...,
c as coln
...
查询应该检索整数矩阵。
使用 ObjectContext.ExecuteStoreQuery
执行查询时,我得到了正确数量的行,但每一行似乎都是空的。
这是我的代码:
var lines = context.ExecuteStoreQuery<List<int>>(queryString).AsEnumerable()
我怎样才能让它工作?
我
在这里发现我应该使用 ADO.NET 来做这种事情。
遗憾的是,
实体框架 6 在内部映射代码中没有很大的灵活性,因此它无法将 SQL 结果映射到List<int>
或任何其他基元类型集合。
若要了解它无法执行此操作的原因,您需要知道 EF6 在内部使用DbDataReader
来读取 SQL 结果,然后它从预期的泛型结果类型(在您的情况下,该类型是泛型列表)生成ColumnMap
,并使用 ColumnMap 将 SQL 结果动态转换为结果对象,以了解要映射到对象。
根据我上面的解释,EF6 ExecuteStoreQuery 方法正在尝试映射您的列("a"、"b")。等)到 List 对象属性,并且由于 List 类上没有与您的 SQL 结果列名称匹配的属性,因此无法映射它。
这些限制使 ADO.NET 成为动态列的最简单选项之一。您可以使用类似于以下代码中的DbDataReader
:
var arr = new List<int>();
using (var md = new Context())
{
var conn = md.Database.Connection;
conn.Open();
using (IDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select Col1,Col2 from Entities";
using (var reader = (DbDataReader)cmd.ExecuteReader())
{
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
arr.Add(reader.GetInt32(i));
}
}
}
}
}