Linqで.distinctを使用して、テーブルの1つのフィールドに基づいて結果を取得しようとしています(したがって、テーブルから複製されたレコード全体を必要としません)。
私は次のようにdistinctを使用して基本的なクエリを書くことを知っています:
var query = (from r in table1
orderby r.Text
select r).distinct();
r.text
しかし、重複していない結果が必要です。
これを試して:
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
これにより、テーブルがグループ化されText
、各グループの最初の行が使用され、Text
異なる行が生成されます。
MoreLinqには、使用できるDistinctByメソッドがあります。
それはあなたがすることを可能にします:
var results = table1.DistictBy(row => row.Text);
メソッドの実装(引数の検証を除く)は次のとおりです。
private static IEnumerable<TSource> DistinctByImpl<TSource, TKey>(IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
foreach (TSource element in source)
{
if (knownKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
しかし、r.textが複製されていない結果が必要です
あなたがこれを望むように聞こえます:
table1.GroupBy(x => x.Text)
.Where(g => g.Count() == 1)
.Select(g => g.First());
Text
これにより、が一意である行が選択されます。
上記のDanielHilgarthの回答は、 WithEntity -FrameworkSystem.NotSupported
の例外につながります。Entity-Frameworkでは、次のようにする必要があります。
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
私が見つけたものから、あなたの質問はほとんど正しいです。「selectr」を「selectr.Text」に変更するだけで問題は解決します。これは、MSDNがどのように機能するかを文書化した方法です。
元:
var query = (from r in table1 orderby r.Text select r.Text).distinct();
data.Select(x=>x.Name).Distinct().Select(x => new SelectListItem { Text = x });
それがあなたの場合なら、はっきりとあなたに単一の列を返します!
CountryData.Select(x=>x.COUNTRY_NAME).Distinct()
それ以外の場合は、1つの列で区別される複数の列が必要です。最初にグループ化してから、グループから最初のアイテムを選択する 必要があります。(この場合、異なる値を持つグループ内の残りのアイテムは返されません)
CountryData.GroupBy(a=>a.COUNTRY_NAME).Select(a=>a.First());
このコードを試してください:
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
あなたはこれを試すことができます:table1.GroupBy(t => t.Text).Select(shape => shape.r)).Distinct();