代码之家  ›  专栏  ›  技术社区  ›  mgsdew

无法将类型“System.Collections.Generic.List<AnonymousType#1>”隐式转换为“System.Collections.Generic.List<DAL.HRM_PersonalInformations>”

  •  0
  • mgsdew  · 技术社区  · 9 年前

    我正在尝试从数据库中获取一些数据并将其绑定到下拉列表中。。但出现以下错误:-

    public virtual List<HRM_PersonalInformations>GetAssignePerson(String OCODE, int dptID){
     var query = (context.HRM_PersonalInformations.Where
                 (c => c.OCODE == OCODE && c.DepartmentId == dptID)
                 .Select(c => new {FullName = (c.FirstName + ' ' + c.LastName), c.EID})).ToList();
    
      return query; // It indicate error line
    }
    

    之后,我尝试在下拉列表中绑定数据,我的代码如下:-

    private void FillAssignPerson()
     {
       try
         {
                string OCODE = ((SessionUser)Session["SessionUser"]).OCode;
                int dptId = Convert.ToInt32(ddlAssignPerDept.SelectedValue);
    
                var row = enquiryBll.GetAssignePerson(OCODE, dptId).ToList();
    
                //const string list = "SELECT FirstName + ' ' + LastName AS FullName, EID, FirstName, LastName " +
                //                    "FROM HRM_PersonalInformations " +
                //                    "ORDER BY EID ASC"
                if (row.Count > 0)
                {
                    ddlAssignPerson.Items.Clear();
                    ddlAssignPerson.DataSource = row;
                    ddlAssignPerson.DataTextField = "FullName";
                    ddlAssignPerson.DataValueField = "EID";
                    ddlAssignPerson.DataBind();
                    ddlAssignPerson.Items.Insert(0, new ListItem("----- Select One -----", "0"));
                    ddlAssignPerson.AppendDataBoundItems = false;
                }
            }
    

    这是正确的方式吗??有人能帮我吗?感谢Advance。。

    3 回复  |  直到 9 年前
        1
  •  1
  •   Jon Skeet    9 年前

    好吧,在你的预测中,你有:

    c => new {FullName = (c.FirstName + ' ' + c.LastName), c.EID}
    

    这是在创建一个匿名打字错误的实例,而不是 HRM_PersonalInformations 。如果只有这两个属性 HRM_个人信息 ,您可以将其更改为:

    c => new HRM_PersonalInformations {
       FullName = (c.FirstName + ' ' + c.LastName), 
       EID = c.EID
    }
    

    或者根据您的查询判断,您可能根本不需要投影。您可能会满意:

    return context.HRM_PersonalInformations
                  .Where(c => c.OCODE == OCODE && c.DepartmentId == dptID)
                  .ToList();
    

    或者,如果您只需要这些属性,而实际上不需要列表中的项目作为 HRM_个人信息 ,您可以将方法的签名更改为:

    public virtual IList GetAssignePerson(...)
    

    不能显式地编写指定匿名类型的方法声明,因为它没有名称-但是 List<T> 工具 IList ,所以上面的一定会编译。。。如果您稍后尝试将其中的元素投射到 HRM_个人信息 虽然

    编辑:如果字符串连接有问题,您可能需要在客户端执行该操作。例如:

    public IList GetAssignePerson(String OCODE, int dptID) {
        return context.HRM_PersonalInformations
                      .Where(c => c.OCODE == OCODE && c.DepartmentId == dptID)
                      .Select(c => new { c.FirstName, c.LastName, c.EID })
                      .AsEnumerable() // Do the rest client-side
                      .Select(c => new {
                          FullName = c.FirstName + " " + c.LastName,
                          c.EID
                      })
                      .ToList();
    }
    
        2
  •  0
  •   Hüseyin Burak Karadag    9 年前

    此方法等待您HRM_PersonalInformations,为什么返回匿名类型?

    返回到期望的类型很有用

    尝试此代码

     .Select(c => new HRM_PersonalInformations()
     {
         FullName  = c.FirstName 
         // set other prop 
     });
    
        3
  •  0
  •   Hüseyin Burak Karadag    9 年前

    这是一个简单的样本,

    如果你想定制数据业务流程或UI流程,你需要一个新的模型。例如,你想在下拉列表中显示全名,

    • 添加新文件夹MyCustomizeModels
    • 在MyCustomizeModels中添加新类DropdownLookUpDecimal

    此DropdownLookUpDecimal类。

      public class DropdownLookUpDecimal
        {
            public decimal Value { get; set; }
            public string Text { get; set; }
    
        }     
    

    您可以在项目中使用该类的所有下拉列表。

      public  List<DropdownLookUpDecimal>GetAssignePerson(string oCode, int dptID)  
    {
             var query = context.HRM_PersonalInformations.Where
                 (c => c.OCODE == oCode&& c.DepartmentId == dptID)
                 .Select(c => new DropdownLookUpDecimal
                     {
                         Text = c.FirstName + ' ' + c.LastName,
                         Value = c.EID
                     });      
      return query.ToList();  
     }
    

    只需创建新的.cs并用类填充列表,然后返回list。

    我希望这有帮助