以下示例有效。毫无疑问。问题是如何使以下示例与由select new{…}组成的复杂查询的匿名类型结果集一起工作
控制器:
public ActionResult Index()
{
var myJobs = from j in db.Jobs where j.deleted == false select j;
//Need to REPLACE myJobs WITH a complex query
return View(myJobs.ToList());
}
索引视图:
@model IEnumerable<MyProj.Models.Jobs> //NOT SURE WHAT TO DO HERE
@{
ViewBag.Title = "Jobs";
}
<table>
<tr>
<th>
Job-No
</th>
<th>
Job-Name
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>@String.Format("{0:000000}", item.jobId)
</td>
<td>@item.jobName
</td>
</tr>
}
</table>
如有任何帮助,我们将不胜感激。
很难从问题中理解你的问题——"我不知道该怎么办"有点模糊。
然而,这是我对你的问题的猜测:
如果该查询的基本结果(即元素的IEnumerable
(是由于select new {}
而导致的匿名类型,那么我建议创建一个反映您期望的结果的已知类型(顺便说一句,就是嵌套的可枚举对象等(,并将匿名投影替换为该类型。现在,您可以在视图中声明性地使用该类型。
即,如果您的查询是这样的
from job in jobs
where !job.deleted
select new { id = job.id }
让自己成为一个模型类型:
public class JobQueryResult{
public int id { get; set; }
}
并相应地更改您的select
:
select new JobQueryResult { id = job.id }
然后,您还可以在模型类型上创建一个构造函数,它只接受一个Job
对象,并将其拉入所需的数据(从查询表达式中承担责任(。
无论哪种方式,您现在都有了一个IEnumerable<JobQueryResult>
,可以很容易地将其用作视图中的Model类型。
一个快速而肮脏的方法是考虑使用dynamic
(但你没有从我那里听到(。
考虑到您想要显示"select new"。。。您仍然需要向视图发送一些内容。以新实体中包含最多字段的实体为例。
创建部分类
namespace YourDomain.Model
{
[MetadataType(typeof(EntityWithinXList))]
public partial class EntityWithinXList
{
[DataMember]
public string DesiredFieldFromA{ get; set; }
[DataMember]
public int DesiredFieldFromB{ get; set; }
}
public class EntityWithinXList
{ }
因此,您需要将另外两个表中的两个新字段添加到您的实体中:
var list = (from x in xList
join a in AList on x.commonfield equals a.commonfield
join b in BList on x.newCommonField equals b.newCommonField
select new { x, a.DesiredFieldFromA, b.DesiredFieldFromB }).ToList();
list.ForEach(el =>
{
el.x.DesiredFieldFromA= el.DesiredFieldFromA;
el.x.DesiredFieldFromB= el.DesiredFieldFromB ;
});
return list.Select(p=>p.x);
除非我误解了你的问题,否则应该这样做。您发送到视图的列表是List<EntityWithinXList>