ASP.NET MVC中的数据库上下文和返回动态结果集

Dip*_*ips 8 c# entity-framework asp.net-mvc-3 asp.net-mvc-4

在MVC 4和EF 5中,我想运行动态查询.

var returndata = Context.Database.SqlQuery(Type, strsql, null);
Run Code Online (Sandbox Code Playgroud)

我不知道,它会返回多少个字段并命名.出于这个结果,我想制作将在视图上显示的表结构.

问题:我应该将什么作为类型传递?

我的查询返回以下结果:

第1场,第2场,第3场,第4场,第5场

ROW1 ...

行2 ..

感谢任何建议.

Dar*_*rov 24

您可以使用原始SQL查询,因为EF不支持:

private static IEnumerable<object[]> Read(DbDataReader reader)
{
    while (reader.Read())
    {
        var values = new List<object>();
        for (int i = 0; i < reader.FieldCount; i++)
        {
            values.Add(reader.GetValue(i));
        }
        yield return values.ToArray();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

public ActionResult Index()
{
    using (var ctx = new UsersContext())
    using (var cmd = ctx.Database.Connection.CreateCommand())
    {
        ctx.Database.Connection.Open();
        cmd.CommandText = "SELECT * FROM UserProfile";
        using (var reader = cmd.ExecuteReader())
        {
            var model = Read(reader).ToList();
            return View(model);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

最后在你看来:

@model IEnumerable<object[]>
<table>
    <tbody>
        @foreach (var row in Model)
        {
            <tr>
                @foreach (var column in row)
                {
                    <td>@column</td>
                }
            </tr>
        }
    </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)


Pet*_*ník 11

此方法将SQL select(带参数)中的数据加载到行列表中,其中每行是列的字典(键是列名).

private static List<Dictionary<string, object>> LoadData(string sqlSelect, params object[] sqlParameters)
{
    var table = new List<Dictionary<string, object>>();
    using (var ctx = new DbEntities())
    {
        ctx.Database.Connection.Open();
        using (var cmd = ctx.Database.Connection.CreateCommand())
        {
            cmd.CommandText = sqlSelect;
            foreach (var param in sqlParameters)
                cmd.Parameters.Add(param);
            using (var reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    var row = new Dictionary<string, object>();
                    for (int i = 0; i < reader.FieldCount; i++)
                        row[reader.GetName(i)] = reader[i];
                    table.Add(row);
                }
            }
        }
    }
    return table;
}
Run Code Online (Sandbox Code Playgroud)


Dip*_*ips 6

最后我做的是使用"Mortalus"和ExpandoObject对象建议的TypeBuilder选项.它现在几乎没有性能开销.

从"Mortalus"回答Typebuilder代码然后根据我的要求制作代码,如下所示.

List<Dictionary<string, object>> expandolist = new List<Dictionary<string, object>>();

foreach (var item in returndata)
  {
  IDictionary<string, object> expando = new ExpandoObject();
  foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(item))
     {
      var obj = propertyDescriptor.GetValue(item);
      expando.Add(propertyDescriptor.Name, obj);
     }
     expandolist.Add(new Dictionary<string, object>(expando));
  }

  return expandolist;
Run Code Online (Sandbox Code Playgroud)

所以现在,我有来自动态对象的"Dictionary"对象.使用它你可以在设计时轻松工作,而不是等到运行时使用"动态"对象.