如何使用 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 来做这种事情。

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

遗憾的是,

实体框架 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));
                }
            }
        }
    }
}