通过内连接Linq获取用户的更多信息

本文关键字:信息 用户 获取 连接 Linq | 更新日期: 2023-09-27 17:51:15

我认为在开发的过程中,它必须显示所有进入电影表和炫耀的电影,但这就是我如何尝试这样做的:

它必须找出用户表中有哪些类型,然后显示喜欢第一种类型的用户。

//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是名称

通过内连接Linq获取用户的更多信息

正如评论中提到的,问题实际上是:显示用户喜欢的同一类型的所有电影,然后显示其他所有电影

虽然下面的方法可能不是db效率(懒得为此创建db,所以我在内存中模拟所有内容并使用Linq to Object来解决问题),它当然可以通过以下步骤解决:

  1. 获取推荐(匹配用户的电影类型偏好),如下所示:

        var recommendation = 
            from f in films
            from ug in userGenres
            where ug.UserId == user.Id && ug.GenreId == f.GenreId
            select f;
    
  2. 现在我们知道了用户的偏好,我们可以进一步将其过滤为只是首选电影的Id…并使用它来获取其余的非首选电影(基本上是任何不匹配首选电影id的内容):

        var recommendedFilmIds = recommendation.Select(f => f.Id);
        var everythingElse =
            from f in films
            where !recommendedFilmIds.Contains(f.Id)
            select f;
    
  3. 最后,使用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包含自己的IdgenreId, userGenres包含usergenre之间的多对多关系,特定的user对象包含user id

一个这样的例子可以在:https://dotnetfiddle.net/Skuq3o

如果您使用EF,并且您有指向genre表的导航属性,并且您希望将这些表包含在查询中,请使用.Include(x => x.genre)from f in films之后的任何类型表,以避免n+1选择,如果您希望在最后的选择子句中包含类型信息