1

私はコードを持っています:

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クエリ自体である必要があります。これは問題ありませんが、例外となることなくこの状況に対処できる必要があります。何か案は?

4

3 に答える 3

1

これを2つのステートメントに分割する必要がある場合があります。

DataTable dtCSVMultiSCOPassive = new DataTable();

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

if(query.Any())
{
    dtCSVMultiSCOPassive = query.CopyToDataTable();
}
于 2012-06-18T18:11:12.337 に答える
0

grp.Count()これは常に1であるように見えます。これは、最初のクエリにproduct_idとの一意の組み合わせがあることを示します。owner_org_id

ところで、それ.SelectMany(grp => grp)は完全に冗長だと思います。

于 2012-06-18T18:18:39.790 に答える
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に1つの要素しか含まれていないため、クエリの2番目の条件が原因でクエリがnullを返すことである可能性がありgrp.Count() > 1ます。

于 2012-06-18T18:21:17.357 に答える