Próbuję użyć .distinct w Linq, aby uzyskać wynik na podstawie jednego pola tabeli (więc nie wymagają całego zduplikowanych rekordów z tabeli).
Wiem, jak pisać podstawowe zapytania, używając odrębnych:
var query = (from r in table1
orderby r.Text
select r).distinct();
ale potrzebuję wyników, które r.text
nie są zduplikowane.
Odpowiedzi:
Spróbuj tego:
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
Spowoduje to pogrupowanie tabeli według
Text
i użycie pierwszego wiersza z każdej grupy, co spowoduje utworzenie wierszy, w którychText
jest inny.źródło
table1.GroupBy(x => new { x.Text, x.Property2, x.Property3 }).Select(x => x.First());
GroupBy
nie tworzy pustych grup, zobacz mój poprzedni komentarz. Najprawdopodobniej twój kod zawiera więcej niż to, co tutaj widzisz. Może maszWhere
również lub warunek dlaFirst
.MoreLinq ma metodę DistinctBy , której możesz użyć:
Pozwoli Ci to na:
var results = table1.DistictBy(row => row.Text);
Implementacja metody (bez walidacji argumentów) jest następująca:
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ódło
GroupBy
potrzebuje. Obie metody będą używać wartości domyślnej,EqualityComparer
jeśli żadna nie zostanie podana.Brzmi, jakbyś tego chciała:
table1.GroupBy(x => x.Text) .Where(g => g.Count() == 1) .Select(g => g.First());
Spowoduje to wybranie wierszy, w których
Text
jest unikalny.źródło
Powyższa odpowiedź Daniela Hilgartha prowadzi do
System.NotSupported
wyjątku With Entity-Framework . W przypadku Entity-Framework musi to być:table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
źródło
Na ten temat toczy się wiele dyskusji.
Możesz znaleźć jeden z nich tutaj :
Jedną z najpopularniejszych sugestii jest metoda Distinct, przyjmująca wyrażenie lambda jako parametr, jak wskazał @Servy.
Główny architekt C #, Anders Hejlsberg, zaproponował tutaj rozwiązanie . Wyjaśnienie również, dlaczego zespół projektowy frameworka zdecydował się nie dodawać przeciążenia metody Distinct, która pobiera lambdę.
źródło
Z tego, co znalazłem, Twoje zapytanie jest w większości poprawne. Wystarczy zmienić „select r” na „select r.Text” i to powinno rozwiązać problem. W ten sposób MSDN udokumentowało, jak powinno działać.
Dawny:
var query = (from r in table1 orderby r.Text select r.Text).distinct();
źródło
data.Select(x=>x.Name).Distinct().Select(x => new SelectListItem { Text = x });
źródło
wypróbuj ten kod:
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
źródło
Możesz spróbować tego:
table1.GroupBy(t => t.Text).Select(shape => shape.r)).Distinct();
źródło