【问题标题】:Iterating result of Linq queryLinq查询的迭代结果
【发布时间】:2012-03-06 15:01:26
【问题描述】:

我正在使用以下代码从数据表中获取结果,但是在 foreach 循环中使用结果查询时,它会引发异常:“无法将类型为 'System.Int64' 的对象转换为类型 'System.String'” .请指导我哪里有代码错误。

var query = from detailRow in dtDetail.AsEnumerable() 
group detailRow by detailRow.Field<string>("Domain") into grouping
select new
{
   Domain = grouping.Key,
   Impressions = grouping.Count(),
   Clicks = 
   grouping.Sum(detailRow => int.Parse(detailRow.Field<string>("Clicks").ToString())),
   url = grouping.First<DataRow>()
}; 

foreach (var detailRowGroup in query)
{
  console.wirteline(detailRowGroup.Domain + detailRowGroup.Impressions + detailRowGroup.Clicks + detailRowGroup.url);

 }

【问题讨论】:

    标签: asp.net linq


    【解决方案1】:

    您的dtDetailDataTable 包含一个名为Click 的列,其中包含Int64 类型的值,而您正尝试将其作为String 检索。问题出在下面一行:

    int.Parse(detailRow.Field<string>("Clicks").ToString())
    

    改成:

    int.Parse(detailRow.Field<Int64>("Clicks").ToString())
    

    【讨论】:

    • 谢谢史蒂文,这就是问题所在。但是现在还有另一个问题,那就是 dbnull 值。系统尝试解析空值时抛出异常,不知道如何处理。
    • 您可以使用detailRow.Field&lt;Int64?&gt;("Clicks")(因此使用?)。
    【解决方案2】:

    在不知道您的数据的情况下很难说,但我猜您的 Clicks 列是数字,所以您希望 type 参数位于 long(64 位 int)中?

    detailRow.Field<long>("Clicks")
    

    也许?

    如果这是真的,那么您可能也可以重构代码以避免解析。

    【讨论】:

      【解决方案3】:

      我解决了这个问题,发现我的代码中有两个错误。那些是;
      1。我在 Int64 的地方使用了 String。通过用 Int64 替换 String,错误得到解决。
      2。对于 DBNULL,我使用了 if 条件。
      以下是代码行;

      Clicks = grouping.Sum(detailRow => Int64.Parse(detailRow.IsNull("Clicks") ? "0" : detailRow.Field<Int64>("Clicks").ToString())),
      

      感谢 Steven 和 Steve Haigh。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多