Cannot implicitly convert type system linq IQuerya

2019-03-04 04:06发布

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);
        }

2条回答
放荡不羁爱自由
2楼-- · 2019-03-04 04:07

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
查看更多
兄弟一词,经得起流年.
3楼-- · 2019-03-04 04:23

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>.

查看更多
登录 后发表回答