1

次の例が機能します。それについての質問はありません。問題は、次の例をselectnew{...}で構成される複雑なクエリの匿名タイプの結果セットで機能させる方法です。

コントローラ:

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そのクエリの要素の結果(つまり要素の)が、のために匿名型である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

「selectnew」を表示したいという事実を考えると...ビューに何かを送信する必要があります。新しいエンティティに存在するフィールドが最も多いエンティティを取得します。

部分クラスを作成する

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 に答える