2010-10-11 27 views
7

tengo una estructura de tabla como esta ...Muchos a muchos ordenado por recuento de la relación (Entity Framework, LINQ)

alt text

al importar esto en marco de la entidad se ve así ...

alt text

Lo que tiene que hacer es crear una consulta de LINQ que devolverá una lista de todas las tiendas único, poblada con una lista de las personas que les gusta esa tienda. (fácil, ¿no?)

Necesito filtrar la lista a la lista de amigos de la persona que se pasan como una lista a la consulta linq ..

una cosa más: necesito devolver si la tienda es una de las favoritas de la persona que solicita los datos (el uid como se muestra a continuación)

bien, otra cosa: tengo que devolver la lista ordenados por el mayor número de amigos a los que les gusta un elemento al más bajo (la interfaz de usuario a continuación es incorrecta al respecto)

Aquí está la firma del método de la consulta LINQ necesito

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

} 

Para devolver una interfaz de usuario que tiene este aspecto ...

alt text

+0

hacer la lista de amigos tienen contrapartida entradas "persona" en su base de datos? – Jonn

+0

sí, son personas en la tabla PERSON, es una relación autorreferencial, pero la relación vive con facebook –

+0

¿Qué significa el uid? –

Respuesta

2

Esta consulta le da una lista de todas las tienda única, poblada con una lista de personas a las que les gusta esa tienda que también es del agrado de al menos uno de los amigos de la lista que está aprobando orden por la mayor cantidad de amigos que les gusta la tienda más una bandera para mostrar si cada tienda es del agrado de la persona que solicitó los datos:

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

cómo haría la clasificación por el mayor número de amigos que le gusta la tienda? –

+0

He editado mi respuesta para abordar esto, por favor eche un vistazo. –

+0

es que permite que n = s.People.Count el número total de personas o solo los amigos? –

0

de código de pseudo

var tiendas = nuevo diccionario();

// una entrada para cada tienda, comenzando con count = 0

stores.Add (1, 0);

stores.Add (2, 0);

stores.Add (3, 0);

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

// una entrada para cada persona que contiene la lista de amigos
var person0 = new Person(); person0.Id = 0;

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

var person2 = new Persona(); persona2.Id = 2;

personasWithFriends.Add (0, nueva lista < Persona> {person1, person2}); personasWithFriends.Add (1, nueva lista < Persona> {person0, person2}); personasWithFriends.Add (2, nueva lista < Persona> {person0, person1});

foreach (var tienda en peopleWithFriends.Keys.Select (personId => peopleWithFriends [personId]) .SelectMany (amigos => Enumerable.SelectMany (amigos, amigo => friend.Stores))) { tiendas [store.Id] ++; }

ahora se puede ordenar el diccionario tiendas por los más altos niveles, y devolver el resultado

Cuestiones relacionadas