我正在动态构建具有不同列数的选择查询。
select
a as col0,
b as col1,
...,
c as coln
...
该查询应该检索整数矩阵。
使用ObjectContext.ExecuteStoreQuery
执行查询时,我获得了正确的行数,但每行似乎都是空的。
这是我的代码:
var lines = context.ExecuteStoreQuery<List<int>>(queryString).AsEnumerable()
我怎么能让它发挥作用?
我发现here我应该使用ADO.NET来处理这类事情。
答案 0 :(得分:0)
不幸的是,Entity Framework 6在内部映射代码中没有很大的灵活性,因此它无法将SQL结果映射到您的List<int>
或任何其他原始类型集合。
要理解无法执行此操作的原因,您需要知道内部EF6使用DbDataReader
来读取SQL结果,然后从预期的通用结果类型构建ColumnMap
(在您的情况下,类型是通用List),它使用ColumnMap执行SQL结果到结果对象的动态转换,以了解要映射到对象的哪个属性的列。
根据我上面的解释,EF6 ExecuteStoreQuery方法试图将您的列(&#34; a&#34;,&#34; b&#34; ...等)映射到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));
}
}
}
}
}