Многие ко многим упорядочены по количеству отношений (Entity Framework, Linq) - PullRequest
7 голосов
/ 12 октября 2010

у меня есть такая структура таблицы ...

alt text

Когда я импортирую это в структуру сущности, это выглядит так ...

alt text

Что мне нужно сделать, так это создать запрос из LINQ, который будет возвращать список каждого уникального магазина, заполненный списком людей, которым нравится этот магазин. (легко, правда?)

ЛОВ: Мне нужно отфильтровать список по списку друзей этого человека, который передается в виде списка в запрос linq (приходит с Facebook, поэтому отношения не в БД) ...

ОДНА БОЛЬШЕ: мне нужно вернуться, если магазин является фаворитом человека, запрашивающего данные (uid, как показано ниже)

ОК, ДРУГОЕ Мне нужно вернуть список, отсортированный по наибольшему количеству друзей, которым нравится элемент, на минимальный (в этом отношении приведенный ниже интерфейс неверен)

Вот подпись метода запроса linq, который мне нужен

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

}

Для возврата пользовательского интерфейса, который выглядит следующим образом ...

alt text

Ответы [ 2 ]

2 голосов
/ 12 октября 2010

Этот запрос дает вам список каждого уникального магазина, заполненный списком людей, которым нравится этот магазин, который также нравится по крайней мере одним из друзей в списке, который вы передаете заказ наибольшему количеству друзей, например, магазин плюс флаг, показывающий, нравится ли каждому магазину человек, запросивший данные:

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 голосов
/ 12 октября 2010

псевдокод

var stores = new Dictionary ();

// одна запись для каждого магазина, начиная с count = 0

store.Add (1, 0);

store.Add (2, 0);

stores.Add (3, 0);

var peopleWithFriends = new Dictionary > ();

// одна запись для каждого человека, содержащая список друзей
var person0 = new Person (); person0.Id = 0;

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

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

peopleWithFriends.Add (0, новый список {person1, person2}); peopleWithFriends.Add (1, новый список {person0, person2}); peopleWithFriends.Add (2, новый список {person0, person1});

foreach (вар магазин в peopleWithFriends.Keys.Select (personId => peopleWithFriends [personId]) .SelectMany (friends => Enumerable.SelectMany (friends, friend => friend.Stores))) { магазины [store.Id] ++; }

теперь вы можете отсортировать словарь магазинов по наибольшему количеству и вернуть результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...