我有以下代码,使用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>
如果有人能指出我正确的方向,我将不胜感激
答案 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 }