1

以下示例有效。对此没有任何疑问。问题是如何使以下示例使用由 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>

任何帮助,将不胜感激。

4

2 回答 2

1

从问题中很难理解您的问题-“我不知道该怎么做”有点含糊。

但是,这是我对您的问题的猜测:

IEnumerable如果该查询的基本结果(即element)由于 a 是匿名类型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>可以轻松地将其用作视图中的模型类型。

一个快速而肮脏的方法是考虑使用dynamic- (但你没有从我这里听到)。

于 2012-06-21T11:02:18.940 回答
1

考虑到您想要显示“选择新”的事实......您仍然需要向视图发送一些内容。获取新实体中存在最多字段的实体。

创建部分类

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
    { }

因此,您需要将 2 个其他表中的 2 个新字段添加到您的实体中:

 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>

于 2012-06-21T11:46:06.627 回答