У меня есть модель, в которой место имеет некоторые описания, эти описания связаны с интересами (place.description.interests). Пользователь, просматривающий вид на место, представлен в модели как пользователь, у которого также есть ряд интересов.
Я хочу отсортировать описание по перекрывающимся интересам (включая нулевое перекрытие), где мои текущие Linq:
place dest = (from p in _db.places
where p.short_name == id
select p).Single();
return View(dest);
Теперь следующее будет делать то, что я хочу в SQL, в рассматриваемой схеме:
SELECT COUNT(interest_user.user_id) AS matches, description.*
FROM description JOIN interest_description ON description.user_id = interest_description.user_id AND description.place_id = interest_description.place_id
JOIN interest ON interest_description.interest_id = interest.interest_id
LEFT JOIN interest_user ON interest.interest_id = interest_user.interest_id
WHERE interest_user.user_id = 2
AND description.place_id = 1
GROUP BY interest_description.user_id, interest_description.place_id
ORDER BY matches DESC
Но я слишком новичок в Linq, чтобы знать, как я с этим справлюсь правильно. В идеале я мог бы осуществить это, все еще передавая строго типизированную модель.
Пока мне удалось это:
var desc = from d in _db.descriptions
from i in d.interests
from u in i.users.DefaultIfEmpty()
where d.place_id == PlaceID
&& (u.user_id == userID
(PlaceID и UserID - это аргументы, передаваемые контроллеру, который этим управляет).
Проще говоря, учитывая этот linq, мне просто нужно вернуть d, отсортированное по счетчику i.
моя модель