【问题标题】:Unable to cast object of type '<SelectManyIterator> to type 'System.Collections.Generic.List无法将“<SelectManyIterator>”类型的对象转换为“System.Collections.Generic.List”类型
【发布时间】:2019-02-16 15:07:03
【问题描述】:

我需要从列表中选择特定的两列并为两个组合框加载这些值。我尝试使用 LINQ 执行此操作,但它传递给我一个错误“无法将类型的对象转换为类型 'System.Collections.Generic.List”。

这是我的方法,

private void getVehicleNo()
{
    List<Exp_VehicleDTO> oData = oVehicleBL.VehiclesSearch(Convert.ToInt32(Session["CompanyID"].ToString()));
    oData = ((List<Exp_VehicleDTO>)oData.SelectMany(x => x.VehicleNo)).ToList();
    ddVehicleNo.DataSource = oData;
    ddVehicleNo.DataBind();
}

这里是车辆搜索方法,

public List<Exp_VehicleDTO> VehiclesSearch(int companyId)
{
    List<Exp_VehicleDTO> results = new List<Exp_VehicleDTO>();
    try
    {
        using (CloudConnection oCloudConnection = new CloudConnection(DMSSWE.Common.ConnectionString))
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine(" SELECT ");
            sb.AppendLine("CompanyID,");
            sb.AppendLine("VehicleId,");
            sb.AppendLine("VehicleType,");
            sb.AppendLine("VehicleNo,");
            sb.AppendLine("Status,");
            sb.AppendLine("CreatedDateTime,");
            sb.AppendLine("CreatedBy,");
            sb.AppendLine("CreatedMachine ");
            sb.AppendLine(" FROM Exp_CompanyVehicle ");
            sb.AppendLine(" WHERE 1=1 ");
            sb.AppendLine(" AND (CompanyID=?CompanyID)");

            oCloudConnection.CommandText = sb.ToString();
            oCloudConnection.Parameters.Clear();
            oCloudConnection.Parameters.Add(new Parameter { Name = "CompanyID", Value = companyId });

            using (IDataReader dr = oCloudConnection.ExecuteReader())
            {
                while (dr.Read())
                {
                    Exp_VehicleDTO result = new Exp_VehicleDTO();
                    result.CompanyId = Helper.GetDataValue<int>(dr, "CompanyID");
                    result.VehicleId = Helper.GetDataValue<int>(dr, "VehicleId");
                    result.VehicleType = Helper.GetDataValue<int>(dr, "VehicleType");
                    result.VehicleNo = Helper.GetDataValue<string>(dr, "VehicleNo");
                    result.Status = Helper.GetDataValue<int>(dr, "Status");
                    result.CreatedDateTime = Helper.GetDataValue<DateTime>(dr, "CreatedDateTime");
                    result.CreatedBy = Helper.GetDataValue<string>(dr, "CreatedBy");
                    result.CreatedMachine = Helper.GetDataValue<string>(dr, "CreatedMachine");
                    results.Add(result);
                }
                dr.Close();
            }
        }
        return results;
    }
    catch (Exception ex)
    {
        Logger.Write(ex);
        throw ex;
    }
}

【问题讨论】:

  • 您不需要使用 .ToList() 进行演员表,请尝试删除演员表。
  • 你确定oVehicleBL.VehiclesSearch()方法返回的是一个集合而不是一个对象吗?
  • @JesseJohnson 我已将vehiclesearch方法添加到问题中
  • @RonBeyer 我删除了演员表。但没有任何改变。同样的错误。我可以使用 LINQ 从一组列中获取特定列吗?
  • @Didu 你只想要VehicleNo的列表吗?

标签: c# linq


【解决方案1】:

这一行是错误:

((List<Exp_VehicleDTO>)oData.SelectMany(x => x.VehicleNo)).ToList()

oData.SelectMany(x =&gt; x.VehicleNo) 返回IEnumerable&lt;char&gt; 然后您尝试将其转换为List&lt;Exp_VehicleDTO&gt;

应该是:

var vehicleNos = oData.Select(x => x.VehicleNo).ToList();

【讨论】:

    【解决方案2】:

    我认为您需要使用Select() 而不是SelectMany()。尝试将您的方法更改为:

    private void getVehicleNo()
    {
        List<Exp_VehicleDTO> oData = oVehicleBL.VehiclesSearch(Convert.ToInt32(Session["CompanyID"].ToString()));
        List<string> vehicleNoList = oData.Select(x => x.VehicleNo).ToList();
        ddVehicleNo.DataSource = vehicleNoList;
        ddVehicleNo.DataBind();
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 2015-09-14
      • 1970-01-01
      • 2014-03-14
      相关资源
      最近更新 更多