我有一个场景,我有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; }
}
答案 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))}
);