Unable to fetch Data from View Model Controller to View,i have properly checked the working of query in LINQpad. However I am missing the conversion of the output of query which can be displayable in View.
I have three Data Models Products,Images,Specifications which i combined into ViewModel with only selected properties and want to displaythe same.
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 Class
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; }
}
Note: I did look into the same error Questions in stack overflow However was not able to figure it out.
Error CS0266 Cannot implicitly convert type 'System.Linq.IQueryable<<anonymous type: string Name, string Produt_Code, string Description, string Image_Description, string Image_Name, byte[] image1, string Sz_Measurement_Unit, decimal? Size, string Wg_Measurement_Unit, decimal? Weight, int? Price_Set, int? Price_Sold>>' to 'OMS.ViewModels.ProductRegistrationViewModelVM'. An explicit conversion exists (are you missing a cast?)
Fix:
As Suggested Below ProductRegistrationViewModelVM is made as List item and also ViewModel properties were bound to query properties.
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);
}
The extension method
.Select
will returns aIEnumerable<TResult>
, But you are trying to assign them to a business object of typeProductRegistrationViewModelVM
such assignment is in valid, either you can change the type ofvm
tovar
or you have to make it as List if so the query will be like the following:Now you can easily add another object of type
ProductRegistrationViewModelVM
to this since it a List of the same type. And you should do a small change in return as well. which will be like the following;You create a vm like this:
Then you assign an IQueryable which returns anonymous types to it. That will not pass. Then you try and add a new instance of your view model to it and that will not work either:
Fix
Try this instead:
And make sure your view accepts a Model as
List<ProductRegistrationViewModelVM>
.