2015-01-14 29 views
0

我遇到的情況,我有3個表:實體框架的查詢與子選擇

  • 新聞[ID,名稱]

  • 用戶[ID,名稱]

  • 喜歡[ ID,新聞,用戶]

我想寫一個查詢,將返回所有新聞以及列th at返回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; } 
} 
+1

可以u顯示你的域類? – DarthVader

+0

我已更新! –

回答

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

這裏userId是期望用戶的ID。你會得到用戶喜歡的所有消息。

+0

由於我有一個未映射的屬性來存儲布爾值,如果用戶喜歡的內容,我的查詢可以返回一個新聞列表而不是匿名類型? –

+0

@ user2844832我有你需要的並更新我的答案。 –

0

假設有一個導航屬性從News到`喜歡:

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

因爲我有沒有映射屬性來存儲布爾值,如果用戶喜歡的內容,可我的查詢返回一個列表新聞而不是匿名類型?

當然,只需要創建一個新的News項目,而不是匿名類型:

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

由於我有一個未映射的屬性來存儲布爾值,如果用戶喜歡的內容,我的查詢可以返回一個新聞列表,而不是匿名類型? –

+0

@ user2844832查看我更新的答案。 –