转换类型C#

时间:2014-08-08 13:52:26

标签: c#

我在使用以下方法时遇到了困难:

public override List<Team> Search(Dictionary<string, string> prms,
                                    int pageSize, int page, out int results) 
{
    List<Team> t = null;
    //Team t = null;
    var tresults = new List<Team>();

    using (SqlConnection conn = DB.GetSqlConnection())
    {
        using (SqlCommand cmd = conn.CreateCommand())
        {
            cmd.CommandText = @"SearchForTeam";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            foreach (var key in prms.Keys)
            {
                cmd.Parameters.Add(key, prms[key]);
            }

            SqlDataReader reader 
                      = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            while (reader.Read())
            {
                var temp = Load(reader);

                if (t == null)
                {
                    t = temp;
                }
                else
                {
                    t.CityHistory.Add(temp.CityHistory[0]);
                }
            }
        }
    }
    results = 0;
    return t;
}

错误主要在于if和else语句,其中if块中的temp声称它不能隐式地将类型DataLayer.Team转换为System.Collections.GenericList&#34;

编辑: 这是我的加载方法:

        public Team Load(SqlDataReader reader)
    {
        var team = new Team()
        {
            TeamID = Int32.Parse(reader["TeamID"].ToString()),
            TeamName = reader["TeamName"].ToString()
        };

        team.CityHistory.Add(
            new TeamCity(
             Int32.Parse(reader["TeamCitiesID"].ToString()),
             team.TeamID,
             Int32.Parse(reader["CityID"].ToString()),
             reader["CityName"].ToString(),
             Int32.Parse(reader["YearStart"].ToString()),
             Int32.Parse(reader["YearEnd"].ToString())
            )
        );
    return team;
    }

4 个答案:

答案 0 :(得分:1)

t定义为List<Team>,但您稍后会说t.CityHistory。 CityHistory显然不是List<>的财产。我猜它是Team的属性,但是因为你从未向我们表明我们无法说出来。

向我们展示Team的定义和Load()的方法签名,也许我们可以给出答案。

更新(来自OP的更新)

现在,我将假设您正在获取多行,每个城市一行,并重复团队信息。所以,你想要的是:

    var temp = Load(reader);
    // remove t definition above
    var  t = tresults.FirstOrDefault(team=> team.TeamId == temp.TeamId);


    if (t == null)
    {
        t = temp;
        tresults.Add(t);
    }
    else 
        t.CityHistory.Add(temp.CityHistory[0]);

(根据史蒂夫的评论再次更新)

答案 1 :(得分:1)

您必须先将temp打包到列表中,然后将其分配给t

if (t == null) {
  t = new List<Team>() { temp }
} else {
  t.add(temp);
}

答案 2 :(得分:0)

非常评论:

考虑以下重构方法:

private IEnumerable<Team> LoadTeams()
{
    using (SqlConnection conn = DB.GetSqlConnection())
    {
        using (SqlCommand cmd = conn.CreateCommand())
        {
            cmd.CommandText = @"SearchForTeam";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            foreach (var key in prms.Keys)
            {
                cmd.Parameters.Add(key, prms[key]);
            }

            SqlDataReader reader 
                      = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            while (reader.Read())
            {
                yield return Load(reader);
            }
        }
    }
}

public override List<Team> Search(Dictionary<string, string> prms,
                                    int pageSize, int page, out int results) 
{
    List<Team> searchResult = new List<Team>; 

    //Team t = null;
    var tresults = new List<Team>();

    foreach(Team team in LoadTeams())
    {
         if (team .....)
             searchResult.Add(team);
    }

    results = 0;

    return searchResult;
}

考虑到 NEEDED 初始化:

    List<Team> searchResult = new List<Team>; 

并问自己:以下摘录应该做什么? :

if (team .....)
   searchResult.Add(team);

P.S。:也是

    results = 0;

应该看起来像:

    results = searchResult.Count;

答案 3 :(得分:-1)

我不得不在这里猜一点,但我认为你的Load()方法正在返回一个数据类型'DataLayer.Team',听起来像是一个团队,而你正试图将它分配给' t',这是一个团队列表。

尝试:

t.Add(temp) 

t.Add(temp as Team). 

您一直在使用'var'声明并没有帮助。