2017-01-27 4 views
0

Не удалось получить данные из View Model Controller для просмотра, я правильно проверил работу запроса в LINQpad. Однако мне не хватает преобразования вывода запроса, который может отображаться в представлении.Невозможно неявно преобразовать систему типов linq IQueryable в системные коллекции generic Список

У меня есть три модели данных Продукты, изображения, спецификации, которые я объединил в ViewModel только с выбранными свойствами и хочу их отобразить.

public class ViewModelController : Controller 
    { 
     private OMSEntities db = new OMSEntities(); 
     // GET: ViewModel 
     public ActionResult Index() 
     { 
      var product = new Product(); 
      var prices = new Price(); 
      var orders = new Order(); 
      ProductRegistrationViewModelVM vm = new ProductRegistrationViewModelVM(); 

      vm =(from p in db.Products 
         join i in db.Images on p.ProductId equals i.Product_Id 
         join s in db.Specifications on p.ProductId equals s.Product_Id 
         select new 
         { 
          //Product 
          p.Name, 
          p.Produt_Code, 
          p.Description, 
          //Image 
          i.Image_Description, 
          i.Image_Name, 
          i.image1, 
          //Specifications 
          s.Sz_Measurement_Unit, 
          s.Size, 
          s.Wg_Measurement_Unit, 
          s.Weight, 
          s.Price_Set, 
          s.Price_Sold 
         }); 

      vm.Add(new ProductRegistrationViewModelVM()); 

      return View(vm.ToList()); 
     } 

ViewModel класса

public class ProductRegistrationViewModelVM 
    { 
     //Products 
     public int ProductId { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
     public string Produt_Code { get; set; } 
     public Nullable<int> Supplier_Id { get; set; } 
     public IEnumerable<Supplier> Supplier { get; set; } 
     //Image 
     public string Image_Description { get; set; } 
     public string Image_Name { get; set; } 
     public byte[] image1 { get; set; } 

     //Specifications 

     public string Sz_Measurement_Unit { get; set; } 
     public Nullable<decimal> Size { get; set; } 
     public string Size_Name { get; set; } 
     public string Wg_Measurement_Unit { get; set; } 
     public Nullable<decimal> Weight { get; set; } 

     public Nullable<int> Price_Set { get; set; } 
     public Nullable<int> Price_Sold { get; set; } 


    } 

Примечание: Я смотрю на те же вопросы об ошибках в переполнение стека Однако не в состоянии понять это.

CS0266 Ошибка Не удается неявно преобразовать тип «System.Linq.IQueryable < < анонимный тип: строка Имя, строка Produt_Code, строка Описание, строка Image_Description, строка имя_образа, байт [] image1, строка Sz_Measurement_Unit, десятичное? Размер, строка Wg_Measurement_Unit, десятичная? Вес, внутр. Price_Set, int? Price_Sold >> 'to' OMS.ViewModels.ProductRegistrationViewModelVM '. Явное преобразование существует (вы пропали без вести бросок?)

Fix:

В предлагаемых ниже ProductRegistrationViewModelVM выполнен в виде элемента списка, а также ViewModel свойства были связаны для запроса свойств.

public ActionResult Index() 
     { 
      var product = new Product(); 
      var prices = new Price(); 
      var orders = new Order(); 
      List<ProductRegistrationViewModelVM> vm = new List<ProductRegistrationViewModelVM>(); 
      vm= (from p in db.Products 
         join i in db.Images on p.ProductId equals i.Product_Id 
         join s in db.Specifications on p.ProductId equals s.Product_Id 
         select new ProductRegistrationViewModelVM() 
        { 
         //Product 
         Name=p.Name, 
         Produt_Code= p.Produt_Code, 
         Description = p.Description, 
          //Image 
          Image_Description= i.Image_Description, 
          Image_Name= i.Image_Name, 
          image1= i.image1, 
         //Specifications 
         Sz_Measurement_Unit= s.Sz_Measurement_Unit, 
          Size= s.Size, 
          Wg_Measurement_Unit=s.Wg_Measurement_Unit, 
          Weight=s.Weight, 
          Price_Set=s.Price_Set, 
          Price_Sold= s.Price_Sold 
        }).ToList(); 

      return View(vm); 
     } 
+0

Вам необходимо показать полную информацию об ошибке в вашем вопросе.В вашем запросе создается коллекция анонимных объектов, а не коллекция 'ProductRegistrationViewModelVM'. –

+1

Лучше всего предположить, что вы хотите 'vm = (из p в db.Products .....). Выберите (x => новый ProductRegistrationViewModelV() {Name = x.Name, ....}). ToList(); ', хотя неясно, почему вы добавляете экземпляр по умолчанию, используя' vm.Add (новый ProductRegistrationViewModelVM()); ' –

+0

@StephenMuecke vm.Add (новый ProductRegistrationViewModelVM()); автоматически генерируется в методе индекса контроллеров. – Arun3x3

ответ

1

Метод расширения .Select будет возвращает IEnumerable<TResult>, но вы пытаетесь присвоить их в бизнес-объект типа ProductRegistrationViewModelVM такое поручение находится в силе, либо вы можете изменить тип vm к var или вы должны сделать его в виде списка, если так, запрос будет иметь следующий вид:

List<ProductRegistrationViewModelVM> vm =(from p in db.Products 
        join i in db.Images on p.ProductId equals i.Product_Id 
        join s in db.Specifications on p.ProductId equals s.Product_Id 
        select new ProductRegistrationViewModelVM 
        { 
         //Product 
         p.Name, 
         p.Produt_Code, 
         p.Description, 
         //Image 
         i.Image_Description, 
         i.Image_Name, 
         i.image1, 
         //Specifications 
         s.Sz_Measurement_Unit, 
         s.Size, 
         s.Wg_Measurement_Unit, 
         s.Weight, 
         s.Price_Set, 
         s.Price_Sold 
        }).ToList(); 

Теперь вы можете легко добавить еще один объект типа ProductRegistrationViewModelVM на это, так как ему список того же типа. И вы тоже должны внести небольшую перемену. который будет выглядеть следующим образом;

return View(vm); // No ToList is needed here since it is already a list 
+0

После реализации этого кода я сталкиваюсь с ошибкой. «Невозможно инициализировать тип« ProductRegistrationViewModelVM »с Инициализатор коллекции, потому что он не реализует «Sysmtems.Collections.IEnumerable». – Arun3x3

0

Вы можете создать виртуальную машину, как это:

ProductRegistrationViewModelVM vm = new ProductRegistrationViewModelVM(); 

Затем вы назначаете IQueryable, который возвращает анонимные типы к нему. Это не пройдет. Затем вы пытаетесь добавить новый экземпляр вашей модели представления к нему, и что не будет работать:

vm.Add(new ProductRegistrationViewModelVM()); 

Fix

Попробуйте вместо этого:

var vm = (from p in db.Products 
     join i in db.Images on p.ProductId equals i.Product_Id 
     join s in db.Specifications on p.ProductId equals s.Product_Id 
     select new ProductRegistrationViewModelVM 
     { 
      //Product 
      p.Name, 
      p.Produt_Code, 
      p.Description, 
      //Image 
      i.Image_Description, 
      i.Image_Name, 
      i.image1, 
      //Specifications 
      s.Sz_Measurement_Unit, 
      s.Size, 
      s.Wg_Measurement_Unit, 
      s.Weight, 
      s.Price_Set, 
      s.Price_Sold 
     }); 

return View(vm.ToList()); 

И убедитесь, что ваш view принимает модель как List<ProductRegistrationViewModelVM>.

+0

После реализации этого кода я столкнулся с ошибкой. «Невозможно инициализировать тип« ProductRegistrationViewModelVM »с помощью инициализатора коллекции, поскольку он не реализует« Sysmtems.Collections.IEnumerable ». – Arun3x3

+0

Вы использовали точный код в ответе? Где вы получаете эту ошибку? – CodingYoshi

+0

Я иду за ошибкой после ** // Product p.Name, ** после чего я привязал свойства к свойствам viewmodel явно, чтобы исправить ошибку. – Arun3x3