2010-10-11 16 views
7

Mam strukturę tabeli tak ...wiele do wielu uporządkowane według liczby relacji (Entity Framework, LINQ)

alt text

Kiedy importować to w Entity Framework wygląda to tak ...

alt text

Co muszę zrobić, to zbudować zapytanie z LINQ, która zwraca listę wszystkich unikalnego sklepu, zaludnionych z listą ludzi, którzy lubią tego sklepu. (łatwo, prawda?)

ZŁOTA: Muszę odfiltrować listę do listy przyjaciół, które zostaną przekazane jako lista do zapytania linq (pochodzi z Facebooka, więc relacje nie są w db). ..

jeszcze jedno: muszę wrócić jeśli sklep jest ulubionym osoba składająca wniosek o danych (uid jak pokazano poniżej)

OK, jeszcze jedno: muszę wrócić listę posortowane według największej liczby przyjaciół, którzy podoba mi się pozycja najniższa (ui poniżej jest źle pod tym względem)

Oto podpis Sposób kwerendy LINQ muszę

public List<Store> GetTopStoresFilteredByFriends 
      (int uid, List<int> friends, int size = 10){ 

} 

Aby powrócić interfejs użytkownika, który wygląda tak ...

alt text

+0

Czy lista znajomych ma odpowiednika „osoba” wpisy w Twojej db? – Jonn

+0

tak, są osobami w tabeli PERSON, jest to relacja własna, ale związek żyje z facebookiem –

+0

Co to jest skrót? –

Odpowiedz

2

To zapytanie daje listę wszystkich unikalny sklep, zawierający listę osób, które lubią ten sklep, który jest również lubiany przez co najmniej jednego z przyjaciół na liście, że przekazujesz zamówienie przez największą liczbę znajomych, którzy lubią sklep i flagę, aby pokazać, czy nie każdy sklep jest lubiany przez osobę, która zażądała danych:

var query = (from s in ctx.Stores.Include("People") 
      from p in s.People 
      let n = friends.Sum(f => s.People.Count(item => item.PersonID == f)) 
      where friends.Any(f => f == p.PersonID) 
      select new { 
       TheStore = s, 
       IsFavorite = s.People.Any(ppl => ppl.PersonID == uid), 
       N = n 
      }) 
      .Distinct() 
      .OrderByDescending(o => o.N); 
+0

jak zrobiłbyś sortowanie według największej liczby znajomych tak jak w sklepie? –

+0

Zmieniłem moją odpowiedź na ten adres, proszę spojrzeć. –

+0

jest to, że niech n = s.People.Count całkowita liczba osób lub po prostu przyjaciół? –

0

pseudokod

var przechowuje = nowego słownika();

// jeden wpis dla każdego magazynu, wychodząc z liczbą = 0

stores.Add (1, 0);

stores.Add (2, 0);

stores.Add (3, 0);

var peopleWithFriends = new Dictionary < int, List < Osoba>>();

// jeden wpis dla każdej osoby zawierającej listę znajomych
var person0 = new Person(); person0.Id = 0;

var person1 = new Person(); person1.Id = 1;

var person2 = new Person(); person2.Id = 2;

peopleWithFriends.Add (0, nowa lista < Osoba> {osoba1, osoba2}); peopleWithFriends.Add (1, nowa lista < Osoba> {osoba0, osoba2}); peopleWithFriends.Add (2, nowa lista < Osoba> {person0, person1});

foreach (var sklep w peopleWithFriends.Keys.Select (PersonID => peopleWithFriends [PersonID]) .SelectMany (przyjaciele => Enumerable.SelectMany (znajomi, znajomy => friend.Stores))) { przechowuje [store.Id] ++; }

teraz można sortować słownika sklepów według najwyższej liczby i zwraca wynik

Powiązane problemy