具有子选择的实体框架查询

本文关键字:实体 框架 查询 选择 | 更新日期: 2023-09-27 18:37:28

我有一个场景,我有 3 个表:

  • 新闻 [ID, 名称]

  • 用户 [ID、名称]

  • 喜欢 [ID, 新闻, 用户]

我正在尝试编写一个查询,该查询将返回所有新闻以及返回 true 或 false 的列(如果特定用户喜欢或不喜欢某个内容)。

在SQL上,我会像这样:

select *, 
(select top 1 id from newslike nl where nl.newsid = n.id and nl.userid = 1) 
from News n

如何使用 EF 查询实现此目的?

我已经向我的类添加了此布尔值的 NotMapped 属性


编辑:

public partial class News
{
    public int Id { get; set; }       
    public virtual ICollection<NewsLike> NewsLike { get; set; }
    [NotMapped]
    public bool LikedByCurrentUser { get; set; }
}

public partial class NewsLike
{
    public int Id { get; set; }
    public int NewsId { get; set; }
    public int UserId { get; set; }
    public virtual News News { get; set; }
    public virtual User User { get; set; }
}

具有子选择的实体框架查询

News.Where(n => n.Likes.Any(l => l.UserId == userId));

此处userId是所需用户的 ID。您将获得用户喜欢的所有新闻。

假设有一个从News到'Likes的导航属性:

db.News.Select(
    n => new {n.Id, n.Name, UserLikes = n.Likes.Any(l => l.userid == 1))}
    );

由于如果用户喜欢内容,我有一个未映射的属性来存储 bool 值,我的查询是否可以返回新闻列表而不是匿名类型?

当然,只需创建一个新的News项而不是匿名类型:

db.News.Select(
    n => new News {
        Id = n.Id,
        Name = n.Name, 
        LikedByCurrentUser = n.NewsLike.Any(l => l.userid == currentUser))}
    );