Вот sql
SELECT v.VideoID, v.Title, v.isActive
FROM Videos v
JOIN
(
SELECT vt.VideoID, Count(*) as MatchCount
FROM VideoTags vt
WHERE vt.TagID in
(
SELECT TagID
FROM Tags t
WHERE t.Tag in ('horror', 'scifi')
)
GROUP BY vt.VideoID
) as sub
ON v.VideoID = sub.VideoID
ORDER BY sub.MatchCount desc
А вот и Линк.
List<string> TagList = new List<string>() {"horror", "scifi"};
//find tag ids.
var tagQuery =
from t in db.Tags
where TagList.Contains(t.Tag))
select t.TagID
//find matching video ids, count matches for each
var videoTagQuery =
from vt in db.VideoTags
where tagQuery.Contains(vt.TagID)
group vt by vt.VideoID into g
select new { VideoID = g.Key, matchCount = g.Count;
//fetch videos where matches were found
//ordered by the number of matches
var videoQuery =
from v in db.Videos
join x in videoTagQuery on v.VideoID equals x.VideoID
orderby x.matchCount
select v
//hit the database and pull back the results
List<Video> result = videoQuery.ToList();
Ой, подождите - у вас нет списка тегов, у вас есть видео и вы хотите видео с похожими тегами. Ok:
SELECT v.VideoID, v.Title, v.isActive
FROM Videos v
JOIN
(
SELECT vt.VideoID, Count(*) as MatchCount
FROM VideoTags vt
WHERE vt.TagID in
(
SELECT TagID
FROM VideoTags vt2
WHERE vt2.VideoID = @VideoID
)
GROUP BY vt.VideoID
) as sub
ON v.VideoID = sub.VideoID
ORDER BY sub.MatchCount desc
И Linq такой же, кроме изменений запроса тега
int myVideoID = 4
//find tag ids.
var tagQuery =
from t in db.VideoTags
where t.VideoID = myVideoID
select t.TagID