我有一段代码:
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查询本身消除所有行。这很好,但我需要能够处理这种情况,而不会成为例外。有什么想法吗?
答案 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_id
和owner_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
。