我认为在开发的过程中它必须显示所有进入电影制片并炫耀的电影,但这就是我试图这样做的方式:
它必须找出用户tablen中哪些类型在哪些后面显示喜欢第一个的用户。
//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();
表格信息
布鲁杰尔的名字 id = BrugereId Fk_generId属于用户选择的基因。 和许多其他
Gener是这个名字 将generId作为id
答案 0 :(得分:0)
正如评论中所提到的,问题确实是:显示与用户偏好的同一类型的所有电影,然后显示其他所有内容。
虽然以下方法可能不具有数据库效率(懒得为此创建数据库,所以我模拟内存中的所有内容并使用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 ...并用它来获得其他不受欢迎的电影(基本上任何不匹配的首选电影Ids ):
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
和{之间的多对多关系{1}}以及包含genre
。
user
对象
可在以下位置找到此示例:https://dotnetfiddle.net/Skuq3o
如果您使用EF,并且您拥有user id
表的导航属性,并且希望将这些表作为查询的一部分包含在内,请使用genre
或在{.Include(x => x.genre)
之后调用您的类型表如果您希望在最终选择子句中包含流派信息,请避免n + 1选择。