MVC 3-绑定到自定义的匿名类型linq查询



以下示例有效。毫无疑问。问题是如何使以下示例与由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>

最新更新