Database context and Return Dynamic Result Set in ASP.NET MVC

前端 未结 8 1623
说谎
说谎 2020-12-14 13:42

In MVC 4 and EF 5 i want to run dynamic query.

var returndata = Context.Database.SqlQuery(Type, strsql, null);

i don\'t know, how many fie

相关标签:
8条回答
  • 2020-12-14 14:00

    Finally i made is using TypeBuilder option suggested by "Mortalus" and ExpandoObject object. It has little performance overhead right now.

    Take Typebuilder code from "Mortalus" answer then i made code according to my requirement as below.

    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;
    

    so now, I have "Dictionary" object from dynamic object. and using it you can work easily at design time rather then wait until runtime using "dynamic" object.

    0 讨论(0)
  • 2020-12-14 14:03

    You could use a raw SQL query because EF doesn't support that:

    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();
        }
    }
    

    and then:

    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);
            }
        }
    }
    

    and finally in your view:

    @model IEnumerable<object[]>
    <table>
        <tbody>
            @foreach (var row in Model)
            {
                <tr>
                    @foreach (var column in row)
                    {
                        <td>@column</td>
                    }
                </tr>
            }
        </tbody>
    </table>
    
    0 讨论(0)
提交回复
热议问题