C# - LINQ查询返回null到表并抛出异常

时间:2012-06-18 18:05:11

标签: c# linq exception

我有一段代码:

var tblGroupedMultiPassive = dtCSV.AsEnumerable()
                                  .Where(r => r.Field<String>("course_type_id") == "3")
                                  .GroupBy(r => new
                                  {
                                       product_id = r.Field<String>("product_id"),
                                       owner_org_id = r.Field<String>("owner_org_id"),
                                  });

if (tblGroupedMultiPassive.Count() > 0)
    dtCSVMultiSCOPassive = tblGroupedMultiPassive.Where(grp => grp.Count() > 1)
                                                 .SelectMany(grp => grp)
                                                 .CopyToDataTable();

基本上在分配给dtCSVMultiSCOPassive的最终语句中,它会抛出没有行的异常。我知道在这个查询之前有行,所以它必须是LINQ查询本身消除所有行。这很好,但我需要能够处理这种情况,而不会成为例外。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您可能需要将其分为两个语句:

DataTable dtCSVMultiSCOPassive = new DataTable();

var query = tblGroupedMultiPassive.Where(grp => grp.Count() > 1).SelectMany(grp => grp);

if(query.Any())
{
    dtCSVMultiSCOPassive = query.CopyToDataTable();
}

答案 1 :(得分:0)

我认为grp.Count()始终为1,这表示您在第一次查询中有product_idowner_org_id的唯一组合。

顺便说一句,我相信.SelectMany(grp => grp)完全是多余的。

答案 2 :(得分:0)

您确定此语句不会返回null:

dtCSVMultiSCOPassive = tblGroupedMultiPassive.Where(grp => grp.Count() > 1);

因为第一个条件tblGroupedMultiPassive.Count() > 0似乎是真的,我会尝试:

if (tblGroupedMultiPassive.Count() > 0)
{
    dtCSVMultiSCOPassive = tblGroupedMultiPassive.Where(grp => grp.Count() > 1);

    if(dtCSVMultiSCOPassive != null)
       dtCSVMultiSCOPassive = dtCSVMultiSCOPassive.CopyToDataTable();
}

事实上,问题可能是几乎每个grp只包含一个元素,因此查询返回null,因为查询中的第二个条件grp.Count() > 1