问题
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);
}
回答1:
The extension method .Select
will returns a IEnumerable<TResult>
, But you are trying to assign them to a business object of type ProductRegistrationViewModelVM
such assignment is in valid, either you can change the type of vm
to var
or you have to make it as List if so the query will be like the following:
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();
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;
return View(vm); // No ToList is needed here since it is already a list
回答2:
You create a vm like this:
ProductRegistrationViewModelVM vm = new ProductRegistrationViewModelVM();
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:
vm.Add(new ProductRegistrationViewModelVM());
Fix
Try this instead:
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() );
And make sure your view accepts a Model as List<ProductRegistrationViewModelVM>
.
来源:https://stackoverflow.com/questions/41885384/cannot-implicitly-convert-type-system-linq-iqueryable-to-system-collections-gene