2016-07-15 11 views
1

グループ内にない複数のカラムを選択しようとしていますが、linq-c#を使用しています。linq group byグループでない複数のカラムを選択

linqを使用して、ISNULL(fieldOne、 '')、ISNULL(fieldTo、 '')でグループ化し、各グループのfield_one、field_Two、field_Threeを選択しようとしています。だから、グループが戻ってくる行ごとに、私はたくさんの行を見たい。

これまでのところ、私は以下のようなことがありますが、必要な列をすべて選択することはできません。

var xy = tableQueryable.Where(
      !string.IsNullOrEmpty(cust.field_One) 
      || ! string.IsNullOrEmpty(ust.field_Two) 
      ).GroupBy(cust=> new { field_One= cust.field_One ?? string.Empty, field_Tow = cust.field_Two ?? string.Empty}).Where(g=>g.Count()>1).AsQueryable(); 

誰かがplsを助けることができますか?あなたはかなりある

答えて

3

- あなたが欠落しているすべてのグループからSelectです:SelectManyはにすべての結果をダンプしながら

var xy = tableQueryable 
    .Where(!string.IsNullOrEmpty(cust.first_name) || ! string.IsNullOrEmpty(ust.lastName)) 
    .GroupBy(cust=> new { first_name = cust.first_name ?? string.Empty, last_name = cust.last_name ?? string.Empty}) 
    .Where(g=>g.Count()>1) 
    .ToList() // Try to work around the cross-apply issue 
    .SelectMany(g => g.Select(cust => new { 
     Id = cust.Id 
    , cust.FirstName 
    , cust.LastName 
    , cust.RepId 
    })); 

Select各グループからは、あなたがしたいフィールドの投影を行います平らなリスト。

+0

これは素晴らしいようですが、実行できません。次のエラーが表示されます。 –

+0

System.NotSupportedException:クエリがネストしたクエリに対して 'CrossApply'を呼び出そうとしましたが、 'CrossApply'に適切なキーがありませんでした。 at System.Data.Entity.Core.Query.PlanCompiler.NestPullup.ApplyOpJoinOp(Op op、Node n)... –

+0

@MikeTurner LINQ2SQL/EFに問題があると思いますが、ToListを挿入するといいでしょう2番目の 'Where'の後に、グループ化がメモリ内で行われるようにします。編集を参照してください。 – dasblinkenlight

2

これはあなたのために働くでしょうか?

var groupsWithDuplicates = tableQueryable 
    .Where(c => !string.IsNullOrWhiteSpace(c.first_name) || !string.IsNullOrWhiteSpace(c.last_name)) 
    .GroupBy(c => new { FirstName = c.first_name ?? "", LastName = c.last_name ?? "" }) 
    .Where(group => group.Count() > 1) // Only keep groups with more than one item 
    .ToList(); 

var duplicates = groupsWithDuplicates 
    .SelectMany(g => g) // Flatten out groups into a single collection 
    .Select(c => new { c.first_name, c.last_name, c.customer_rep_id }); 
+0

残念ながら - 私は同じエラーが発生します - –

+0

System.NotSupportedException:クエリがネストされたクエリで 'CrossApply'を呼び出そうとしましたが、 'CrossApply'に適切なキーがありませんでした。 –

+0

これは、SQLであまりにも多くをやろうとしています.ToList()をスローしてデータをプルダウンし、LINQ to Objectsで残りの作業を行います。上記の私の編集を参照してください。 –