Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用ExecuteStoreQuery选择不同数量的列_C#_Entity Framework - Fatal编程技术网

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

C# 如何使用ExecuteStoreQuery选择不同数量的列,c#,entity-framework,C#,Entity Framework,我正在动态构建一个包含不同列数的select查询 select a as col0, b as col1, ..., c as coln ... 该查询应该检索整数矩阵 使用ObjectContext.ExecuteStoreQuery执行查询时,我得到了正确数量的行,但每行似乎都是空的 这是我的密码: var lines = context.ExecuteStoreQuery<List<int>>(queryString).AsEnumerable()

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

select
  a as col0,
  b as col1,
  ...,
  c as coln
...
该查询应该检索整数矩阵

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

这是我的密码:

var lines = context.ExecuteStoreQuery<List<int>>(queryString).AsEnumerable()
我怎样才能让它工作


我发现我应该使用ADO.NET来实现这类功能。

不幸的是,Entity Framework 6在内部映射代码中没有太多的灵活性,因此它无法将SQL结果映射到您的列表或任何其他基元类型集合

要理解为什么它不能这样做,您需要知道EF6在内部使用DbDataReader来读取SQL结果,然后它从预期的泛型结果类型构建一个ColumnMap在您的情况下,该类型是泛型列表,它使用ColumnMap将SQL结果动态转换为结果对象,以了解要映射到对象的哪个属性的列

根据我上面的解释,EF6 ExecuteStoreQuery方法正在尝试映射列a、b等。到列表对象属性,并且由于列表类上没有与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));
                }
            }
        }
    }
}

您的查询试图选择多个列,而您指示结果集将是具有多个INT记录列表的单个列。这是未经测试的,但考虑返回动态上下文。这将返回只读匿名对象的列表。