我认为在开发的过程中,它必须显示所有进入电影表和炫耀的电影,但这就是我如何尝试这样做的:
它必须找出用户表中有哪些类型,然后显示喜欢第一种类型的用户。
//As I said, I have a session at the top of the code.
int brugerid = Convert.ToInt16(Session["id"]);
var result = (from f in db.films
//it must find out which genres have in users tablen where after to show the users who like the first.
//brugere are users
//gener It is the genes users like.
join usersgenerId in brugere.Fk_generId on gener.generId equals usersgenerId.BrugereId
select new
{
image_navn = ((f.imgs.FirstOrDefault(i => i.feature == true)).navn == null ? "default.png" : (f.imgs.FirstOrDefault(i => i.feature == true)).navn),
image_feature = f.imgs.Where(A => A.feature == true),
film_navn = f.navn,
film_id = f.filmId,
film_tekst = f.tekst,
film_gener = f.gener.navn
}).ToList();
RepeaterFilmList.DataSource = result;
RepeaterFilmList.DataBind();
表信息
Brugere的名字id = BrugereIdFk_generId属于用户选择的基因。和许多其他
Gener是名称
正如评论中提到的,问题实际上是:显示用户喜欢的同一类型的所有电影,然后显示其他所有电影
虽然下面的方法可能不是db效率(懒得为此创建db,所以我在内存中模拟所有内容并使用Linq to Object来解决问题),它当然可以通过以下步骤解决:
-
获取推荐(匹配用户的电影类型偏好),如下所示:
var recommendation = from f in films from ug in userGenres where ug.UserId == user.Id && ug.GenreId == f.GenreId select f;
-
现在我们知道了用户的偏好,我们可以进一步将其过滤为只是首选电影的Id…并使用它来获取其余的非首选电影(基本上是任何不匹配首选电影id的内容):
var recommendedFilmIds = recommendation.Select(f => f.Id); var everythingElse = from f in films where !recommendedFilmIds.Contains(f.Id) select f;
-
最后,使用
Union
将它们连接在一起,并注入Genre.Name
等用于显示目的的必要字段,如下:var filmList = recommendation.Union(everythingElse).Select(f => new { f.Id, f.Title, Genre = genres.Where(g => g.Id == f.GenreId).Select(g => g.Name).First() });
现在,合并后的列表将首先包含首选电影(在顶部),然后是不喜欢的电影。
模拟表如下:films
包含自己的Id
和genreId
, userGenres
包含user
和genre
之间的多对多关系,特定的user
对象包含user id
。
一个这样的例子可以在:https://dotnetfiddle.net/Skuq3o
如果您使用EF,并且您有指向genre
表的导航属性,并且您希望将这些表包含在查询中,请使用.Include(x => x.genre)
或from f in films
之后的任何类型表,以避免n+1选择,如果您希望在最后的选择子句中包含类型信息