无法将类型'System.Collections.Generic.List <anonymoustype#1>'隐式转换为'System.Collections.Generic.List <dal.hrm_personalinformations>'</dal.hrm_personalinformations> </anonymoustype#1>

时间:2015-02-09 06:27:48

标签: asp.net c#-4.0 webforms entity-framework-4

我正在尝试从数据库中获取一些数据并将它们绑定在下拉列表中..但是收到以下错误: -

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 个答案:

答案 0 :(得分:1)

嗯,在你的预测中你有:

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

这是创建一个匿名错字的实例 - 而不是HRM_PersonalInformations的实例。如果这些是HRM_PersonalInformations中您需要的唯一两个属性,则可以将其更改为:

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_PersonalInformations的实例,则可以将方法的签名更改为:

public virtual IList GetAssignePerson(...)

保持身体不变。你不能显式地编写一个指定匿名类型的方法声明,因为它没有名称 - 但List<T>实现IList,所以上面肯定会编译......如果您稍后尝试将其中的元素强制转换为HRM_PersonalInformations

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

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

答案 1 :(得分:0)

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

返回预期类型

非常有用

试试此代码

 .Select(c => new HRM_PersonalInformations()
 {
     FullName  = c.FirstName 
     // set other prop 
 });

答案 2 :(得分:0)

这是一个简单的样本,

如果您想自定义数据业务流程或UI流程,您需要一个新模型,例如您希望在Dropdown中显示全名,

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

这个DropdownLookUpDecimal类。

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

    }     
  

您可以在项目中使用此类所有Dropdown。

  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。

我希望它有所帮助

相关问题