2010-10-11 11 views
7

j'ai une structure de table comme ça ...Beaucoup à beaucoup commandés par le nombre de rapports (Entity Framework, LINQ)

alt text

Quand j'importer dans le cadre de l'entité qu'elle ressemble à ceci ...

alt text

ce que je dois faire est de construire une requête de LINQ qui retourne une liste de chaque magasin unique, peuplé d'une liste de personnes qui aiment ce magasin. (facile, non?)

LA CAPTURE: Je dois filtrer la liste à la liste d'amis de la personne qui est transmise en tant que liste à la requête linq (vient de facebook, donc les relations ne sont pas en db). ..

uNE cHOSE: -je besoin de revenir si le magasin est un favori de la personne qui demande les données (le uid comme indiqué ci-dessous)

OK, une autre chose: je dois retourner la liste trié par le plus grand nombre d'amis qui aiment un élément au plus bas (le ui ci-dessous est faux à cet égard)

Voici la signature de la méthode de la requête LINQ i need

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

} 

Pour retourner une interface utilisateur qui ressemble à ceci ...

alt text

+0

Faites la liste d'amis ont contrepartie entrées « personne » dans votre base de données? – Jonn

+0

oui, ce sont des gens dans la table PERSON, c'est une relation d'auto-référencement, mais la relation vit avec facebook –

+0

Qu'est-ce que l'uid signifie? –

Répondre

2

Cette requête vous donne une liste de tous les magasin unique, peuplé d'une liste de personnes qui aiment ce magasin qui est également aimé par au moins un des amis de la liste que vous passez en ordre par le plus grand nombre d'amis qui aiment le magasin plus un drapeau pour montrer si oui ou non chaque magasin est aimé par la personne qui a demandé les données:

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

comment feriez-vous le tri par le plus grand nombre d'amis ça ressemble au magasin? –

+0

J'ai édité ma réponse pour répondre à cette question, s'il vous plaît jeter un oeil. –

+0

est ce que n = s.People.Count le nombre total de personnes ou seulement les amis? –

0

code pseudo

stocke var = new Dictionary();

// une entrée pour chaque magasin, en commençant par count = 0

stores.Add (1, 0);

magasins.Add (2, 0);

magasins.Add (3, 0);

var personnesWithFriends = nouveau Dictionnaire < int, Liste < Personne>>();

// une entrée pour chaque personne contenant la liste d'amis
var person0 = new Person(); personne0.Id = 0;

var personne1 = nouvelle Personne(); personne1.Id = 1;

var personne2 = nouvelle Personne(); personne2.Id = 2;

peopleWithFriends.Add (0, nouvelle liste < Personne> {personne1, personne2}); peopleWithFriends.Add (1, nouvelle liste < Personne> {person0, person2}); peopleWithFriends.Add (2, nouvelle liste < Personne> {person0, person1});

foreach (magasin var en peopleWithFriends.Keys.Select (personId => peopleWithFriends [personId]) .SelectMany (amis => Enumerable.SelectMany (amis, ami => friend.Stores))) { magasins [store.Id] ++; }

maintenant, vous pouvez trier le dictionnaire stocke le nombre le plus élevé, et retourner le résultat