如何使用ExecuteStoreQuery选择不同数量的列

时间:2014-11-19 13:16:38

标签: c# entity-framework

我正在动态构建具有不同列数的选择查询。

select
  a as col0,
  b as col1,
  ...,
  c as coln
...

该查询应该检索整数矩阵。

使用ObjectContext.ExecuteStoreQuery执行查询时,我获得了正确的行数,但每行似乎都是空的。

这是我的代码:

var lines = context.ExecuteStoreQuery<List<int>>(queryString).AsEnumerable()

我怎么能让它发挥作用?


我发现here我应该使用ADO.NET来处理这类事情。

1 个答案:

答案 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));
                }
            }
        }
    }
}
相关问题