2

以前、各オブジェクト内の特定のプロパティに基づいて、オブジェクトのリスト内の重複レコードを削除する方法についてStackoverflowに質問しました。

私が探していた答え(以下を参照)を取得しました。これは、重複を削除するためのプロパティとしてMainHeadingIDを使用してオブジェクトの個別のリストを返すクエリです。

public IList<tblcours> GetAllCoursesByOrgID(int id)
{
    return _UoW.tblcoursRepo.All.
        Where(c => c.tblCourseCategoryLinks.Any(cl => cl.tblUnitCategory.tblUnit.ParentID == id))
        .GroupBy(c => c.MainHeadingID)
        .Select(g => g.FirstOrDefault())
        .ToList();
}

しかし、今はもっと助けが必要です!MainHeadingIDが180に等しくない場合にのみ重複する値を削除するように、上記のクエリを修正する方法はありますか?GroupBy行を次のように修正してみました

.GroupBy(c => c.MainHeadingID != 180)

しかし、これはうまくいきませんでした。

どんな助けでもこれで大いに感謝されるでしょう。

ありがとう。

4

2 に答える 2

2

lazyberezovskyの答えは、EFのバグが原因で失敗します(EFのLINQサポートの品質を考えると驚くことではありません)。ハックで動作させることができます:

.SelectMany(g => g.Key == 180 ? g.Take(int.MaxValue) : g.Take(1))

また

.SelectMany(g => g.Take(g.Key == 180 ? int.MaxValue : 1))

これがSQLに変換される方法のため、パフォーマンスは特に良くないことに注意してください。

于 2013-02-26T14:16:46.150 に答える
2

以下は、LINQ to SQL で機能します。

return _UoW.tblcoursRepo.All
   .Where(c => c.tblCourseCategoryLinks.Any(cl => cl.tblUnitCategory.tblUnit.ParentID == id))
   .GroupBy(c => c.MainHeadingID)
   //.SelectMany(g => g.Key == 180 ? g : g.Take(1))
   .SelectMany(g => g.Take(g.Key == 180 ? Int32.MaxValue : 1))
   .ToList();

コメント: SelectMany上記のクエリでMainHeadingIDは、180 に等しいグループからすべてのアイテムが選択されますが、他のグループからは 1 つのアイテムのみが取得されます (つまり、個別の結果)。Linq to SQL はコメントアウトされた部分を変換できませんが、@usr のおかげで回避できます。


Linq to Entities は単純化されたクエリでさえ変換できません。この場合の唯一のオプションは、2 つのクエリの結果を単純に連結することだと思います。

Expression<Func<tblcours, bool>> predicate = x =>
  x.tblCourseCategoryLinks.Any(cl => cl.tblUnitCategory.tblUnit.ParentID == id)
int headingId = 180;

return _UoW.tblcoursRepo.All
   .Where(c => c.MainHeadingID != headingId)
   .Where(predicate)
   .GroupBy(c => c.MainHeadingID)
   .Select(g => g.FirstOrDefault())
   .Concat(_UoW.tblcoursRepo.All
               .Where(c => c.MainHeadingID == headingId)
               .Where(predicate))
   .ToList();
于 2013-02-26T13:56:49.070 に答える