解决  无法隐式转换类型error

匿名

活跃的成员
已加入
2020年9月29日
留言内容
38
编程经验
Beginner
我正在尝试获取某些数据库值并将它们存储在数据表中。之后,我将linq应用于按帐号对所有数据进行分组。我将最终结果存储在以下类类型的列表中-


C#:
  class  清单 Items
    {
        public string accountNumbers
        {
            get;
             组 ;
        }
         
        public string itemNumbers
        {
            get;
             组 ;
        }

    }


我的代码是:

C#:
  清单 <ListItems> accounts = new  清单 <ListItems>();

        public 虚空 GetItems(int siteID1, int siteID2)
        {
            con = new SqlConnection(connection);
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "sp_FetchItems";
            cmd.Parameters.AddWithValue("@siteid1", siteID1);
            cmd.Parameters.AddWithValue("@siteid2", siteID2);
            cmd.Connection = con;
            SqlDataAdapter adp = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            adp.Fill(dt);

            accounts = from result in dt.AsEnumerable()  组  result by result.Field<string>("accountNumber");
           
        }

我在第16行遇到以下错误

C#:
无法隐式转换类型'System.Collections.Generic.IEnumerable<System.Linq.IGrouping<string, System.Data.DataRow>>' to 'System.Collections.Generic.List<PricingPractice.ListItems>



我什至尝试使用ToList()转换此表达式,但它也不起作用。
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
第一步是使用从数据库查询中获取的数据填充IEnumerable of 清单 Items,而不是将数据填充到DataTable中。这样,您将只处理一种类型-ListItems-而不是现在尝试从DataRow转到ListItems。
 

匿名

活跃的成员
已加入
2020年9月29日
留言内容
38
编程经验
Beginner
第一步是使用从数据库查询中获取的数据填充IEnumerable of 清单 Items,而不是将数据填充到DataTable中。这样,您将只处理一种类型-ListItems-而不是现在尝试从DataRow转到ListItems。
你的意思是我应该做以下事情?

C#:
IEnumerable<ListItems>  清单 Items;
SqlDataAdapter adp = new SqlDataAdapter(cmd);
adp.Fill(listitems);

但我在这里也出现强制错误。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
您不需要SqlAdapter。所有要做的就是填充数据集。您需要在SqlCommand上调用ExecuteQuery()并在读取器上进行迭代,并创建List项的实例并将其粘贴在List中<ListItems>.
 

匿名

活跃的成员
已加入
2020年9月29日
留言内容
38
编程经验
Beginner
您不需要SqlAdapter。所有要做的就是填充数据集。您需要在SqlCommand上调用ExecuteQuery()并在读取器上进行迭代,并创建List项的实例并将其粘贴在List中<ListItems>.

好的,所以我做了以下工作。调用了一个数据读取器并创建了我的列表项类的实例,并将其添加到我的帐户列表中,但仍然需要按帐号对我的项进行分组。其次,用它来覆盖帐号。

C#:
  SqlDataReader sqlDat = cmd.ExecuteReader();

            while(sqlDat.Read())
            {
                 清单 Items.accountNumbers = sqlDat["accountNumber"].ToString();
                 清单 Items.itemNumbers = sqlDat["itemnumber"].ToString();
                accounts.Add(listItems);
            }
            sqlDat.Close();
 

匿名

活跃的成员
已加入
2020年9月29日
留言内容
38
编程经验
Beginner
哪里?您在代码中的任何地方都没有使用new运算符来创建新的项目实例。 新运算符-C#参考
抱歉,我在代码顶部创建了一个实例,由于它覆盖了我的帐号,但仍然存在潜在的问题,我希望将我的商品按帐号分组,然后存储最终结果在清单中。对于group by,我正在使用linq,但是它给了我强制错误

C#:
  SqlDataReader sqlDat = cmd.ExecuteReader();

            while(sqlDat.Read())
            {
                 清单 Items  清单 Items = new  清单 Items();
                 清单 Items.accountNumbers = sqlDat["accountNumber"].ToString();
                 清单 Items.itemNumbers = sqlDat["itemnumber"].ToString();
                accounts.Add(listItems);
            }
            sqlDat.Close();

            accountsandItemList = from result in accounts  组  result by result.accountNumbers;
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,925
地点
英国
编程经验
10+
while(sqlDat.Read()){ListItems 清单 Items = new 清单 Items();
告诉我,该循环中创建了多少次新列表?
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,028
地点
挪威
编程经验
10+
告诉我,该循环中创建了多少次新列表?
在我看来,ListItems是单个项目(定义后1),它已添加到帐户列表中。我不太明白为什么ListItems 它是会员accountNumbers 和itemNumbers 是复数形式(而不是ListItem和成员accountNumber和itemNumber)。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,925
地点
英国
编程经验
10+
在我看来,ListItems是单个项目(定义后1)
谢谢你让我看起来两次。  :凉: 我没注意到昨晚深夜工作导致上午8点坠机,我只在下午1:30醒来。我还是很累

是的,我同意,这里的命名政策很糟糕。对象名称必须确定,并且需要根据其使用目的进行命名。

当与项目列表完全无关时,为什么要命名为listItems?该类仅保存上下文属性信息,而不包含列表。给该类命名,以反映其用法的体面,例如 帐户详细资料.
Then when declaring your 清单 , you can have 清单 <AccountDetails> in your declaration. And add your account details to that 清单 when retrieving your data.

下面的引号确认了所使用的查询返回了多个结果。因此,我假设他们想要多个返回结果吗?
否则我想他们将不需要使用组。  :)
其次,用它来覆盖帐号。
这是我看到的问题。
  • 给定一个以上的结果,根据OP的查询返回,如果他们想要一个奇异的结果,或者一个特定的 结果的),则OP首先使用错误的查询。 (如果他们想要单个结果或特定结果 的结果),通常您应该知道在SQL语句中选择什么。如果没有您 选择 * 和狭窄与 哪里 子句和其他附加子句,然后在linq中过滤结果以匹配给定条件(如果需要进一步缩小范围)。如果需要任何分组,则应在查询中进行而不是在查询返回结果之后进行。

  • 在Linq中进行筛选应该是最后的选择,因为您应该只从数据库中获取所需的信息,并且您实际上应该在返回数据的查询中进行尽可能多的过滤,而不是在从查询返回数据之后进行过滤。

  • 在代码中 用于以特定方式将数据分组在一起。如果OP希望返回单个项目,则他们将不会在Linq中使用group。这意味着他们在不需要时会返回所有结果。

  • 如果在代码末尾调用List(),则可以根据给定条件返回要分组的数据的列表。
 
最佳 底部