2012-06-21 1 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

Вы пробовали отправить в качестве модели: «@model List "? –

+0

Мне нужно связать анонимный тип, а не MyProj.Models.Jobs – Kaf

ответ

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 - (но вы этого не слышали).

+0

Думаю, вы понимаете вопрос.Комментарий «Не уверен, что делать», потому что именно здесь начинается вопрос. Я вижу в вашем ответе немного света, но не могли бы вы привести мне пример. Я новичок в mvc tbh. Спасибо за ответ. – Kaf

+0

Я обновил - должен быть довольно самодостаточным, надеюсь –

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>