2011-02-03 10 views
49

szukam wykonywać kwerendy na liście przykładzie obiektówLINQ odrębną - Hrabia

Date  Username 

01/01/2011 james 
01/01/2011 jamie 
01/01/2011 alex 
01/01/2011 james 
02/01/2011 matt 
02/01/2011 jamie 
02/01/2011 alex 
02/01/2011 james 
02/01/2011 james 
02/01/2011 lucy 
02/01/2011 alex 
03/01/2011 james 
03/01/2011 bob 
03/01/2011 bob 
03/01/2011 james 
03/01/2011 james 
04/01/2011 alex 
04/01/2011 alex 
04/01/2011 alex 

chcę użyć LINQ kwerendy listę terminów z liczbą unikalnych loginów użytkowników.

Na przykład:

01/01/2011 - 3 
02/01/2011 - 5 
03/01/2011 - 2 
04/01/2011 - 1 

Próbowałem jak testowane szereg oświadczeń LINQ, ale żaden z nich daje mi pożądany rezultat. Najbliższe, jakie mam, to podanie różnych dat, ale z liczbą wszystkich użytkowników.

Każda pomoc zostanie bardzo doceniona.

+9

Proszę dodać te wypróbowane instrukcje LINQ - wtedy możemy zobaczyć, dlaczego poszły nie tak. –

Odpowiedz

92
logins 
    .GroupBy(l => l.Date) 
    .Select(g => new 
    { 
    Date = g.Key, 
    Count = g.Select(l => l.Login).Distinct().Count() 
    }); 
+4

Jestem nowy w Linq i zastanawiam się, jak napisałbyś to w składni zapytania Linq zamiast składni metody Linq. – comecme

+1

@comecme Rozumiem, że opuściłeś ten komentarz sprzed wieków, ale sprawdź moje tłumaczenie do składni metody poniżej. – Kevin

+1

Obawiam się, że Twój kod zawsze zwróci Count = 1, to dlatego, że dodałeś Disctinct() i sprawisz, że policzysz jeden element. Jeśli usuniesz to, będziesz miał ilość elementów. Mam nadzieję że to pomoże!!! ;) –

5

Może coś takiego?

var list = new List<MyClass>(new[] { 
     new MyClass { Date = DateTime.Parse("01/01/2011"), Username = "james" }, 
     new MyClass { Date = DateTime.Parse("01/01/2011"), Username = "james" }, 
     new MyClass { Date = DateTime.Parse("01/01/2011"), Username = "alex" }, 
     new MyClass { Date = DateTime.Parse("01/01/2011"), Username = "james" }, 
     new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "matt" }, 
     new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "jamie" }, 
     new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "alex" }, 
     new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "james" }, 
     new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "james" }, 
     new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "lucy" }, 
     new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "alex" }, 
     new MyClass { Date = DateTime.Parse("03/01/2011"), Username = "james" }, 
     new MyClass { Date = DateTime.Parse("03/01/2011"), Username = "bob" }, 
     new MyClass { Date = DateTime.Parse("03/01/2011"), Username = "bob" }, 
     new MyClass { Date = DateTime.Parse("03/01/2011"), Username = "james" }, 
     new MyClass { Date = DateTime.Parse("03/01/2011"), Username = "james" }, 
     new MyClass { Date = DateTime.Parse("04/01/2011"), Username = "alex" }, 
     new MyClass { Date = DateTime.Parse("04/01/2011"), Username = "alex" }, 
     new MyClass { Date = DateTime.Parse("04/01/2011"), Username = "alex" } 
    }); 

list.GroupBy(l => l.Date, l => l.Username) 
    .Select(g => new { 
       Date = g.Key, 
       Count = g.Distinct().Count() 
      }); 
+0

Ahh dam, że byłam tak skromna, dziękuję, że niedługo zajrzę do wdrożenia. Dziękuję za szybką odpowiedź. –

+0

@aspect - w rzeczywistości daje to datę z powiązaną liczbą unikalnych loginów użytkownika, z pytania, czy chcesz pogrupować daty z taką samą liczbą unikalnych loginów? jeśli tego chcesz, to po prostu dodaj kolejną grupę po selekcji według liczby i już tam jesteś! – theburningmonk

1

Innym sposobem rozwiązania tego problemu jest do grupy dwukrotnie sprawdzić próbkę

  var dist = listLogins.GroupBy(d => d.date + d.Username) 
       .Select(x => x.First()) 
       .GroupBy(d => d.date).Select(y => new { date = y.Key, count = y.Count() }).ToList(); 
6

można zrobić w ciągu jednej rozmowy GroupBy,

var Query = list.GroupBy(
       (item => item.DateTime), 
       (key, elements) => new { 
              key = key, 
              count = elements 
                .Distinct() 
                .Count() 
             } 
       ); 
+1

to jest najlepsza odpowiedź. Dzięki @naveen – JoshYates1980

14

Zdaję sobie sprawę, że jest to starożytny pytanie, ale natknąłem się na niego i zobaczyłem komentarz o chęci użycia składni metody i nie mogłem sobie odpowiedzieć ... I może ma zaburzenie kodowania.

W składni zapytań wygląda to tak ... pamiętać, że nie ma składni zapytań do Distinct i Count

from l in logins 
group l by l.Date into g 
select new 
{ 
    Date = g.Key, 
    Count = (from l in g select l.Login).Distinct().Count() 
}; 

Dla porównania boku przez strony do składni metody oryginał (który osobiście lubię lepiej) tutaj ...

logins 
    .GroupBy(l => l.Date) 
    .Select(g => new 
    { 
    Date = g.Key, 
    Count = g.Select(l => l.Login).Distinct().Count() 
    }); 
+1

Dziękuję za poświęcenie czasu, aby odpowiedzieć na mój komentarz. – comecme