테이블의 한 필드 만 기준으로 Linq에서 구별 .distinct를 사용하여 테이블의 한 필드를 기반으로

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고유 한 행을 만듭니다.


답변

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고유 한 행을 선택합니다 .


답변

위의 Daniel Hilgarth 의 답변은 Entity-FrameworkSystem.NotSupported예외로 이어집니다 . Entity-Framework를 사용하면 다음과 같아야 합니다.

table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());


답변

이 주제와 관련하여 많은 토론이 있습니다.

당신은 그들 중 하나를 찾을 수 있습니다 여기에 :

가장 인기있는 제안 중 하나는 @Servy가 지적한 것처럼 람다 식을 매개 변수로 사용하는 Distinct 메서드입니다.

C #의 수석 설계자 인 Anders Hejlsberg는 여기 에서 해결책을 제안했습니다 . 또한 프레임 워크 디자인 팀이 람다가 필요한 Distinct 메서드의 오버로드를 추가하지 않기로 결정한 이유를 설명합니다.


답변

내가 찾은 것 중에서 귀하의 쿼리는 대부분 정확합니다. “select r”을 “select r.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 });