Linq GroupBy匿名类型错误MVC4

时间:2014-04-20 12:27:09

标签: c# asp.net-mvc linq razor

我有以下代码,使用group来选择不同的值。 Intellisence和代码中断显示查询正在按预期工作。

public ActionResult _PortfoliosbyCountry()
    {
        var portfolios = db.Portfolios;
        var query = (from t in portfolios
                     group t by new { t.UserId, t.CountryId,t.PortfolioTypeId }
                         into grp
                         select new 
                         {
                             grp.Key.CountryId,
                             grp.Key.PortfolioTypeId,
                             grp.Key.UserId  
                         }).ToList();


        return PartialView(query);
    }

模型

namespace RefST.Models
{
public class Portfolio
{
    [Key]
    public int PId { get; set; }
    [Required]
    public string Title { get; set; }
    [ScaffoldColumn(false)]
    public DateTime DatePosted { get; set; }
    [ScaffoldColumn(false)]
    public DateTime LastEdited { get; set; }
    [AllowHtml][Required]
    public string Body { get; set; }
    public int UserId {get; set; }     
    public int CountryId { get; set; }
    public int PortfolioTypeId { get; set; }
    public virtual Country Country { get; set; }
    public virtual PortfolioType PortfolioType { get; set; }
}
}

问题是剃刀视图会出现以下错误 传递到字典中的模型项的类型为:'System.Collections.Generic.List 1[<>f__AnonymousType19 3 [System.Int32,System.Int32,System.Int32]]',但此字典需要一个模型'System.Collections.Generic.IEnumerable`1 [RefST.Models.Portfolio]'类型的项目。

@model IEnumerable<RefST.Models.Portfolio>

<p>
   @Html.ActionLink("Create New", "Create")
</p>

<table>
 <tr>

    <th>
        @Html.DisplayNameFor(model => model.UserId)
    </th>

    <th>
        @Html.DisplayNameFor(model => model.CountryId)
    </th>


    <th>
        @Html.DisplayNameFor(model => model.PortfolioTypeId)
    </th>

    <th></th>
 </tr>

 @foreach (var b in Model) {
  <tr>
    <td>
        @Html.DisplayFor(modelItem => b.UserId)
    </td>
    <td>
        @Html.DisplayFor(modelItem => b.CountryId)
    </td>
    <td>
        @Html.DisplayFor(modelItem => b.PortfolioTypeId)
    </td>
  </tr>
 }
 </table>

如果有人能指出我正确的方向,我将不胜感激

2 个答案:

答案 0 :(得分:4)

我认为在这一行你可以这样做:

select new PortFolio
                     {
                        countryId= grp.Key.CountryId,
                        PortfolioTypeId= grp.Key.PortfolioTypeId,
                        UserId= grp.Key.UserId,
                        //Add others members with default value
                        Titel=string.Empty;
                        ....  
                     }).ToList();

因此,您确定将IEnumerable<Portfolio>作为Model

发送

答案 1 :(得分:4)

如果你删除了过多的.NET泛型语法,那么错误信息就会清楚地显示出错:

  

The model item passed into the dictionary is of type: 'List<AnonymousType<int, int, int>>', but this dictionary requires a model item of type 'IEnumerable<Portfolio>'.

在您的代码中,如果忽略分组,您基本上就是这样做:

from x in y ... 
select new { CountryId = x.a, PortfolioTypeId = x.b, UserId = x.c }

生成一个恰好有三个整数字段的匿名类型。虽然你没有给出类型名称,但编译器给它起了一个名字,你不能在C#中为自己的类型使用它(在这种情况下,它& #39; s称为<>f__AnonymousType19)。

当两个匿名类型具有相同顺序的相同类型的相同字段时,编译器将它们视为相同类型。但是,匿名类型永远不会与您自己命名的任何类型相同,并且编译器不会自动在它们之间进行转换。您的Razor视图需要一个类型为Portfolio的对象列表,并且您向它发送了一个不是该对象的对象列表。您的匿名类型恰好具有正确的三个字段这一事实与编译器无关 - 它只是简单的错误类型

幸运的是,它很容易解决。在LINQ查询中选择正确的命名类型:

from x in y ... 
select new Portfolio { CountryId = x.a, PortfolioTypeId = x.b, UserId = x.c }