通过Inner join Linq从用户获取更多信息

时间:2015-05-30 12:43:24

标签: c# linq

我认为在开发的过程中它必须显示所有进入电影制片并炫耀的电影,但这就是我试图这样做的方式:

它必须找出用户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

1 个答案:

答案 0 :(得分:0)

正如评论中所提到的,问题确实是:显示与用户偏好的同一类型的所有电影,然后显示其他所有内容

虽然以下方法可能不具有数据库效率(懒得为此创建数据库,所以我模拟内存中的所有内容并使用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 ...并用它来获得其他不受欢迎的电影(基本上任何不匹配的首选电影Ids ):

        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() 
    });
    
  4. 而且你有它,组合列表现在首先包含两个首选电影(在顶部),之后是不受欢迎的电影。

    模拟表如下:films包含自己的IdgenreId以及userGenres,其中包含user和{之间的多对多关系{1}}以及包含genre

    的特定user对象

    可在以下位置找到此示例:https://dotnetfiddle.net/Skuq3o

    如果您使用EF,并且您拥有user id表的导航属性,并且希望将这些表作为查询的一部分包含在内,请使用genre或在{.Include(x => x.genre)之后调用您的类型表如果您希望在最终选择子句中包含流派信息,请避免n + 1选择。