Linq에서 .distinct를 사용하여 테이블의 한 필드를 기반으로 결과를 얻으려고합니다 (따라서 테이블에서 전체 복제 된 레코드가 필요하지 않음).
다음과 같이 distinct를 사용하여 기본 쿼리를 작성하는 것을 알고 있습니다.
var query = (from r in table1
orderby r.Text
select r).distinct();
하지만 r.text
중복되지 않은 결과가 필요합니다 .
Linq에서 .distinct를 사용하여 테이블의 한 필드를 기반으로 결과를 얻으려고합니다 (따라서 테이블에서 전체 복제 된 레코드가 필요하지 않음).
다음과 같이 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
고유 한 행을 만듭니다.
table1.GroupBy(x => new { x.Text, x.Property2, x.Property3 }).Select(x => x.First());
GroupBy
빈 그룹을 만들지 않으면 이전 주석을 참조하십시오. 코드에 여기에 표시된 것보다 많은 것이 포함되어있을 가능성이 큽니다. 어쩌면 당신은에 Where
대한 조건이나 조건이있을 수 First
있습니다.
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;
}
}
}
GroupBy
. EqualityComparer
제공되지 않은 경우 두 방법 모두 기본값을 사용합니다 .
위의 Daniel Hilgarth 의 답변은 Entity-Framework 의 System.NotSupported
예외로 이어집니다 . Entity-Framework를 사용하면 다음과 같아야 합니다.
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());