首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用ExecuteStoreQuery选择不同数量的列

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

Stack Overflow用户
提问于 2014-11-19 13:16:37
回答 1查看 785关注 0票数 0

我正在动态地构建一个包含不同列数的select查询。

代码语言:javascript
复制
select
  a as col0,
  b as col1,
  ...,
  c as coln
...

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

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

这是我的代码:

代码语言:javascript
复制
var lines = context.ExecuteStoreQuery<List<int>>(queryString).AsEnumerable()

我怎么能让它起作用呢?

我发现here应该在这类事情上使用ADO.NET。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-19 16:03:31

不幸的是,实体框架6在内部映射代码中没有很大的灵活性,因此它无法将SQL结果映射到您的List<int>或任何其他基本类型集合。

要理解它为什么不能这样做,您需要知道EF6在内部使用DbDataReader读取SQL结果,然后从预期的泛型结果类型(在您的示例中,类型是泛型列表)构建ColumnMap,并使用ColumnMap动态地将ColumnMap结果转换为结果对象,以了解要映射到对象的属性的列。

根据我上面的解释,EF6 ExecuteStoreQuery方法试图映射您的列("a",“b”..etc)。到List对象属性,而且由于类中没有匹配您的结果列名的属性,所以它无法映射它为。

这些限制使ADO.NET成为动态列最简单的选项之一。您可以使用如下代码中的DbDataReader

代码语言:javascript
复制
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));
                }
            }
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27017811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档