Возникла проблема при просмотре списка объектов - PullRequest
1 голос
/ 30 мая 2020
public class PriceDetail
{

    public int ID{ get; set; }
    public string Package { get; set; }
    public string Currency { get; set; }
    public int Price { get; set; }
    public string PackageType { get; set; }
    public List<string> Items { get; set; }

}

[WebMethod]
    public static string GetCardDetail(string category)
    {


        string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
        List<PriceDetail> pricingCard = new List<PriceDetail>();
        string query = "select [PricingID],[Package],[Currency],[Price],[PackageType] from [SeoDatabase].[dbo].[tbl_Pricing] where Category = @Category";

        SqlConnection con = new SqlConnection(cs);

        SqlCommand cmd = new SqlCommand(query, con);
        cmd.Parameters.AddWithValue("@Category", category);
        con.Open();

        SqlDataReader rdr = cmd.ExecuteReader();

        while (rdr.Read())
        {

            PriceDetail priceDetail = new PriceDetail();

            priceDetail.ID = Convert.ToInt16(rdr["PricingID"]);

            priceDetail.Package = rdr["Package"].ToString();

            priceDetail.Currency = rdr["Currency"].ToString();

            priceDetail.Price = Convert.ToInt16(rdr["Price"]);

            priceDetail.PackageType = rdr["PackageType"].ToString();

            pricingCard.Add(priceDetail);

        }
        con.Close();

        List<string> items = new List<string>();

        string queryList = "select [Item] from [SeoDatabase].[dbo].[tbl_PricingItem] where PricingID = @pricingID";



        int i = 0;
        while(i < pricingCard.Count)
        {
            SqlCommand listCmd = new SqlCommand(queryList, con);

            con.Open();

            listCmd.Parameters.AddWithValue("@pricingID", pricingCard[i].ID);

            SqlDataReader listReader = listCmd.ExecuteReader();


            while (listReader.Read())
            {
                items.Add(listReader["Item"].ToString());
            }

            pricingCard[i].Items = items;

            items.Clear();

            con.Close();

            i++;
        }



        string obj = JsonConvert.SerializeObject(pricingCard);

        return obj;

    }

Все идет хорошо, когда я достиг второй l oop while (i

1 Ответ

1 голос
/ 30 мая 2020

Причина, по которой это ведет себя не так, как вы могли ожидать, состоит в том, что items, имеющий тип List<string>, является ссылочным типом, а не типом значения. Эту концепцию вам нужно будет хорошо понять при разработке с использованием управляемых языков, таких как C#. MSDN - Ссылка и значение

Упрощенно то, что вы говорите под pricingCard[i].Items = items;, состоит в том, что pricingCard[i].Items теперь является ссылкой на items. Это означает, что в любой момент после этого оценка pricingCard[i].Items просто «отсылает» вас к items, поэтому любые изменения в items будут отражаться во всех ссылках, которые вы сделали на него.

Что вам нужно сделать для каждого l oop, так это «повторно создать экземпляр» items с items = new List<string>(). Это означает: создайте новый экземпляр списка, и новый экземпляр будет ссылаться на следующую итерацию pricingCard[i].Items.

while(i < pricingCard.Count)
{
    items = new List<string>();
    // Do the rest of your process
}

В качестве альтернативы добавьте элементы напрямую:

while (listReader.Read())
{
    pricingCard[i].Items.Add(listReader["Item"].ToString());
}

PS

Вместо использования:

int i = 0;
while(i < pricingCard.Count)
{
    i++;
}

Попробуйте:

for (int i = 0; i < pricingCard.Count; i++)
{}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...