簡體   English   中英

轉換類型C#

[英]Converting types 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塊中的溫度聲稱其“無法將DataLayer.Team類型隱式轉換為System.Collections.GenericList”

編輯:這是我的加載方法:

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

t定義為List<Team> ,但稍后再說t.CityHistory CityHistory顯然不是List<>的屬性。 我猜這是Team的財產,但是由於您從沒有向我們表明我們不能說。

向我們展示Team的定義和Load()的方法簽名,也許我們可以給出答案。

UPDATE(來自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]);

(根據史蒂夫的評論再次更新)

您必須先將temp包裝到List中,然后將其分配給t

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

非常長的評論:

請考慮以下方法重構:

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

請考慮以下需要的初始化:

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

並問自己: 以下摘錄應做什么?

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

PS:也是線

    results = 0;

應該看起來像:

    results = searchResult.Count;

我不得不在這里稍作猜測,但是我假設您的Load()方法返回的數據類型為“ DataLayer.Team”,聽起來像是一個團隊,而您正在嘗試將其分配給“ t”,這是球隊名單。

嘗試:

t.Add(temp) 

要么

t.Add(temp as Team). 

一直使用'var'聲明並沒有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM