2012-06-21 2 views
1

다음 예제가 작동합니다. 그것에 관한 질문이 없습니다. 질문 형성된 복잡한 쿼리의 익명 형식의 결과 집합으로 다음과 같은 예를 작동하게하는 방법은 선택의 새로운 {...}MVC 3 - 사용자 지정된 익명 형식 linq 쿼리에 바인딩

컨트롤러 :

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> 

도움을 주시면 감사하겠습니다.

+0

입니다. "@ 모델 목록 "로 보내려고 했습니까? –

+0

MyProj.Models.Jobs가 아닌 익명 형식을 바인딩해야합니다. – Kaf

답변

1

'무엇을 해야할지 모르겠다'라는 질문에서 문제를 이해하기가 어렵습니다. 다소 모호합니다. 다음, 나는 알려져을 제안

원소 결과 해당 쿼리의 (요소의 예 IEnumerable)는 select new {}로 인해 익명의 유형 인 경우 :

그러나,이 문제에 대한 내 생각이다 (예를 들어 내포 된 enumerables 등을 통해) 결과를 반영하고 대신 익명 투영을 그 유형으로 대체하십시오. 이제보기에서 해당 유형을 선언적으로 사용할 수 있습니다.

즉, 쿼리는 자신에게 모델 유형 확인이

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을 사용하는 것이 더 빠르다고 생각할 것입니다. (하지만 그 소리는 내게 들리지 않았습니다.)

+0

나는이 질문을 이해한다고 생각합니다.'그걸 어떻게 해야할지 모르겠다'는 말은 질문이 시작되는 곳이기 때문입니다. 나는 당신의 대답에 약간의 빛을 보았지만 나에게 모범을 보일 수 있었습니까? 나는 mvc tbh에 처음이다. 대답 해줘서 고마워. – Kaf

+0

업데이트했습니다. 잘하면 설명이 잘되어야합니다. –

1

"새로운 선택"을 얻고 싶다는 사실을 고려하면 여전히보기에 뭔가를 보내야합니다. 새로운 엔티티에있는 대부분의 필드가있는 엔티티를 가져옵니다. 내가 질문을 오해했습니다 않는

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); 

이 그것을 수행해야합니다

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 개 개의 새로운 필드를 추가해야 할 부분 클래스를 만듭니다. 보기로 보내는 목록이 List<EntityWithinXList>