使用ToExpando方法时出现问题

nos*_*bor 3 linq asp.net-mvc entity-framework razor asp.net-mvc-3

嗨,我尝试使用ToExpando解决方案在剃刀视图中使用匿名类.我使用此解决方案 - > Razor中的动态匿名类型导致RuntimeBinderException

我会写我做的:

  1. 我添加了一个文件Extensions.cs,其中我放了以下代码:

    public static class Extensions
    {
        public static ExpandoObject ToExpando(this object anonymousObject)
        {
            IDictionary<string, object> anonymousDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(anonymousObject);
            IDictionary<string, object> expando = new ExpandoObject();
            foreach (var item in anonymousDictionary)
                expando.Add(item);
            return (ExpandoObject)expando;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我写了一个查询,在控制器方法中从数据库接收元组:

    IEnumerable<dynamic> articles = (from p in db.Articles.Where(p => p.user_id == 2)
            select new
            {
                p.article_id,
                p.title,
                p.date,
                p.category,
                AverageScore = db.Articles_Scores
                    .Where(o => o.user_id == p.user_id && p.article_id == o.article_id)
                    .Average(m => m.score)
            }).AsEnumerable()
              .Select(r => r.ToExpando());
    int ii = 0;
    foreach(var it in articles) {
        // HERE I CAN READ EVERYTHING
        ii = it.article_id;
    }
    return View(articles);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在视图中我声明了一个模型:

    @model IEnumerable<dynamic>
    
    Run Code Online (Sandbox Code Playgroud)
  4. 我试着得到每个元组:

    @foreach (dynamic item in Model) {
    // some code
        @item.article_id // HERE IS EXCEPTION
    }
    
    Run Code Online (Sandbox Code Playgroud)

在foreach行中我得到了一个例外:

RuntimeBinderException:'System.Dynamic.ExpandoObject'不包含'article_id'的定义

我做错了什么?

SLa*_*aks 5

您需要调用.AsEnumerable().ToList()首先强制ToExpando在客户端上运行.