参数 1:无法从 'System.Collections.Generic.List' 转换为 'System.Collections.Generic.List'

Posted

技术标签:

【中文标题】参数 1:无法从 \'System.Collections.Generic.List\' 转换为 \'System.Collections.Generic.List\'【英文标题】:Argument 1: cannot convert from 'System.Collections.Generic.List' to 'System.Collections.Generic.List'参数 1:无法从 'System.Collections.Generic.List' 转换为 'System.Collections.Generic.List' 【发布时间】:2022-01-07 18:02:02 【问题描述】:

我正在学习 Asp.net Core 并使用 CRUD 操作、SQL 服务器和使用实体框架构建一个简单的 Web。 当我尝试构建排序方法时,我在参数员工的这一行中出现了这个错误

return View(this.SortEmployees(employees, SortField, CurrentSortField, SortDirection));

这就是错误:

Severity    Code    Description Project File    Line    Suppression State
Error   CS1503  Argument 1: cannot convert from 'System.Collections.Generic.List<EmployeesApp.Models.Employee>' to 'System.Collections.Generic.List<EmployeesApp.Controllers.Employee>' EmployeesApp    

那是我的模特:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace EmployeesApp.Models

    [Table("Employee", Schema ="dbo")]

    public class Employee
    
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Display(Name ="Employee ID")]
        public int EmployeeId  get; set; 


        [Required]
        [Column(TypeName ="varchar(5)")]
        [MaxLength(5)]
        [Display(Name ="Employee Number")]
        public string EmployeeNumber  get; set; 


        [Required]
        [Column(TypeName = "varchar(150)")]
        [MaxLength(100)]
        [Display(Name = "Employee Name")]
        public string EmployeeName  get; set; 


        [Required]
        [DataType(DataType.Date)]
        [Display(Name ="Date of Birth")]
        [DisplayFormat(DataFormatString = "0:dd-MMM-yyyy")]
        public DateTime DOB  get; set; 


        [Required]
        [DataType(DataType.Date)]
        [Display(Name = "Hiring Date")]
        [DisplayFormat(DataFormatString = "0:dd-MMM-yyyy")]
        public DateTime HiringDate  get; set; 


        [Required]
        [Column(TypeName ="decimal(12,2)")]
        [Display(Name ="Gross Salary")]
        public decimal GrossSalary  get; set; 


        [Required]
        [Column(TypeName = "decimal(12,2)")]
        [Display(Name = "Net Salary")]
        public decimal NetSalary  get; set; 


        [ForeignKey("Department")]
        [Required]
        public int DepartmentId  get; set; 



        [Display(Name = "Department")]
        [NotMapped]
        public string DepartmentName  get; set; 


        public virtual Department Department  get; set; 
    

那是我的控制器:

namespace EmployeesApp.Controllers



    public enum SortDirection
    
        Ascending,
        Descending
    


    public class Employee : Controller
    
       
        HRDatabaseContext dbContext = new HRDatabaseContext();

        public IActionResult Index(string SortField, string CurrentSortField, SortDirection SortDirection)
        
            var employees = GetEmployees();
            return View(this.SortEmployees(employees, SortField, CurrentSortField, SortDirection));
        



        private List<Models.Employee> GetEmployees()
        
            return (from Employee in dbContext.Employees
                    join Department in dbContext.Departments on Employee.DepartmentId equals Department.DepartmentId
                    select new Models.Employee
                    
                        EmployeeId = Employee.EmployeeId,
                        EmployeeName = Employee.EmployeeName,
                        DOB = Employee.DOB,
                        HiringDate = Employee.HiringDate,
                        GrossSalary = Employee.GrossSalary,
                        NetSalary = Employee.NetSalary,
                        DepartmentId = Employee.DepartmentId,
                        DepartmentName = Department.DepartmentName

                    ).ToList();
        


        public IActionResult Add()
        
            ViewBag.Department = this.dbContext.Departments.ToList();
            return View();
        


        [HttpPost]
        public IActionResult Add(Models.Employee model)
        
            ModelState.Remove("EmployeeID");
            ModelState.Remove("Department");
            ModelState.Remove("DepartmentName");
            if (ModelState.IsValid)
            
                dbContext.Employees.Add(model);
                dbContext.SaveChanges();
                return RedirectToAction("Index");
            

            ViewBag.Department = dbContext.Departments.ToList();
            return View("Add", model);
        


        public IActionResult Edit(int ID)
        
            HRDatabaseContext dbContext1 = dbContext;
            Models.Employee data = dbContext1.Employees.Where(e => e.EmployeeId == ID).FirstOrDefault();
           

            ViewBag.Department = this.dbContext.Departments.ToList();
            return View("Add", data);
        


        [HttpPost]
        public IActionResult Edit(Models.Employee model)
        
            ModelState.Remove("EmployeeID");
            ModelState.Remove("Department");
            ModelState.Remove("DepartmentName");
            if (ModelState.IsValid)
            
                dbContext.Employees.Update(model);
                dbContext.SaveChanges();
                return RedirectToAction("Index");
            

            ViewBag.Department = dbContext.Departments.ToList();
            return View();
        


        public IActionResult Delete(int ID)
        
            Models.Employee data = this.dbContext.Employees.Where(e => e.EmployeeId == ID).FirstOrDefault();

            if (data != null)
            
                dbContext.Employees.Remove(data);
                dbContext.SaveChanges();
            

            return RedirectToAction("Index");
        

     
        private List<Employee> SortEmployees(List<Employee> employees, String sortField, string currentSortField, SortDirection sortDirection)
        
        
            if (string.IsNullOrEmpty(sortField))
            
                
                ViewBag.SortField = "EmployeeNumber";
                ViewBag.SortField = SortDirection.Ascending;

            
            else
            
                if (currentSortField == sortField)
                
                
                    ViewBag.SortDirection = sortDirection == SortDirection.Ascending ? SortDirection.Descending : SortDirection.Ascending;
                    
                
                else
                    ViewBag.SortDirection = sortDirection == SortDirection.Ascending;
                    ViewBag.SortField = sortField;

            

            //* create the sorting proccess
            var propertyInfo = typeof(Employee).GetProperty(ViewBag.SortField);
            if (ViewBag.SortDirection == SortDirection.Ascending)
            
                employees = employees.OrderBy(e => propertyInfo.GetValue(e, null)).ToList();
            
            else
            
                employees = employees.OrderByDescending(e => propertyInfo.GetValue(e, null)).ToList();

            

            return employees;
        
    
   

【问题讨论】:

【参考方案1】:

您的控制器中的SortEmployees 方法采用List&lt;Employee&gt;,在这种情况下是Controllers.Employee,而不是您怀疑的Models.Employee

在这种情况下,最好的解决方案是将控制器重命名为 EmployeeController 以遵循 ASP.NET 约定。在 ASP.NET 中,控制器始终命名为 [Name]Controller

【讨论】:

【参考方案2】:
    private List<Employee> SortEmployees(List<Employee> employees, String sortField, string currentSortField, SortDirection sortDirection)
    
    

问题与上述SortEmployees 方法、其参数和使用EmployeesApp.Controllers.Employee 模型而不是EmployeesApp.Models.Employee 的返回数据有关。所以,调用这个方法的时候会报这个错误。

为了解决这个问题,尝试修改SortEmployees方法如下:使用Models.Employee

    private List<Models.Employee> SortEmployees(List<Models.Employee> employees, String sortField, string currentSortField, SortDirection sortDirection)
    

【讨论】:

【参考方案3】:

这是由于模型类名和控制器类名相同导致没有选择正确的模态。在这种情况下,您可以在使用它的任何位置显式添加 Models.Employee 或重命名控制器名称或模型名称本身。

【讨论】:

以上是关于参数 1:无法从 'System.Collections.Generic.List' 转换为 'System.Collections.Generic.List'的主要内容,如果未能解决你的问题,请参考以下文章

错误 C2664:无法将参数 1 从“int”转换为“int (__cdecl *)(int)”

参数 1:无法从 'System.Collections.Generic.List' 转换为 'System.Collections.Generic.List'

错误 C2664:无法将参数 1 从“int”转换为“int []”

PROCEDURE 的参数数量不正确;预期为 1,得到 0。无法从代码中确定错误

无法将参数 1 从 int 转换为 int && 错误 [重复]

错误 C2440:“默认参数”:无法从“const wchar_t [1]”转换为“BSTR”