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

时间:2015-01-14 20:21:47

标签: c# entity-framework lambda

我有一个场景,我有3张桌子:

  • 新闻[身份证,姓名]

  • 用户[身份证,姓名]

  • 喜欢[身份证明,新闻,用户]

我正在尝试编写一个返回所有新闻的查询以及一个返回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; }
}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

假设有News到“喜欢:

的导航属性
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))}
    );