2013-04-17 5 views
1

Я импортировал базу данных с коллекцией MainData в отношениях друг к другу с Subdata, сгенерированный код выглядит примерно так:Использовать linq для заполнения модели данными из двух разных моделей

SubData имеет несколько некомплексированных типов данных, таких как строки и ints.

Я могу импортировать данные в представление, поэтому я знаю, что эта часть работает. Я хочу объединить это в модель, так что у меня есть «NameOfMainData» и коллекция SubData в той же модели для удобства в представлении, но я не хочу, чтобы это сработало, вот моя попытка:

Модель ;

public class DataIWantInAList 
{ 
    public IList<DataIWant> DataList { get; set; } 

} 
public class DataIWant 
{ 
    public string NameOfMainData{ get; set; } 
    public IEnumerable<SubData> SubDataSet{ get; set; } 
} 

в контроллере я думал, что я мог бы добавить элементы в DataList, но я не смог найти что-нибудь в Интернете или работать это для моей личности ... И это,

var DataToView= from p in db.MainData 
         select new DataIWant() 
         { 
          NameOfMainData= p.NameOfMainData, 
          SubDataSet= p.SubDataSet 
         }; 


return View(DataToView); 

Не работает, как предполагалось. Я не так хорош в LINQ, но кажется, что это будет довольно легко и что делает его настолько расстраивающим, когда я не получаю его на работу.

Любые входные данные назначаются.

+0

Вы специально хотите знать, как это сделать с Linq, так что это не ответ, сам по себе, но вы рассмотрели использование AutoMapper (http://automapper.org/)? Делает такую ​​вещь * так * намного проще. –

ответ

1

ОТКАЗ
- данные, выборка производится в предположении, вы используете EntityFramework как я не приспособленного в LINQ только :(пожалуйста, настроить его
- это только один из много способов. Попробуйте поэкспериментировать, когда вы даете модели точке зрения
- params должен быть элементарным заполнителем для «фильтра»
- вы можете развернуть сопоставление любым способом, просто убедитесь, что правильно ссылаетесь в представлении, иначе вы столкнетесь с ошибками во время выполнения

В модели вы можете сделать что-то подобное (хотя я бы переместил сущность-выборку в частную функцию. в вашем классе DataIWant вы просто укажете нужные данные. если вы хотите конкретно карту, то сделать это на инициации вашего DataIWantInAList

public class DataIWantInAList 
{ 
    public IList<DataIWant> data; 

    //Instanciation & Initialization 
    public DataIWantInAList(params customparam) 
    { 
     using(EntitySet ent = new EntitySet()) 
     { 
     //fetch data from DB 
     this.data = (from x in ent.DataTableIWant where param == customparam select x).ToList(); 
     } 
    } 
} 

и в вашем контроллере вы могли бы хотеть пойти:

public ActionResult fooBar() 
{ 
    DataIWantInAList model = new DataIWantInAList(params); 
    return View(model); 
} 

в то время как вы можете получить данные по вашему мнению, в порядке как это:

var List = model.data; 
+0

Спасибо, я попробую это, но попытайтесь перенести его на другую функцию (или, может быть, на контроллер?).:) – Tim

+0

Получил работу безупречно, спасибо :) – Tim

0

Вы можете использовать .Include (...), чтобы получить нужные данные, при условии, что я понимаю ваш вопрос.

var DataToView = from p in db.MainData 
         select new DataIWant() 
         { 
          NameOfMainData= p.NameOfMainData.Include(p => p.SubDataSet) 
         } 
0

Вы можете использовать Include загрузить соответствующие объекты, а затем привязать их к вашему типу модели:

var DataToView= from p in db.MainData 
          .Include("ItemTypeReference") 
         select new DataIWant() 
         { 
          NameOfMainData= p.NameOfMainData, 
          SubDataSet= p.SubDataSet 
             .Select(s => new SubData { 
                 // map SubData fields here 
                 }) 
             .ToList() 
         }; 
+0

Спасибо за помощь! :) Я думаю, что выбор в SubDataSet может сделать это для меня, havent заставил его работать, но похоже, что это путь. – Tim

Смежные вопросы