2016-06-18 81 views
1

我有3個類/表:CarUserUserVote(這是其他兩個之間的橋接表)。組合實體框架查詢中的內連接和左連接

例如:

Car (id/name): 
1/Ford Focus 
2/Honda Civic 
3/Citroen C2 

User (id/ignoreUser): 
1/false 
2/true 
3/false 

UserVote (UserId/CarId) 
1/2 
1/3 
2/1 
3/2 

我有獲取基於投票數前X車的方法。

public IQueryable<Car> GetTopCars(int count) 
{ 
    return context.Car 
     .Include(car => car.UserVote) 
     .Where(car => car.UserVote.Count > 0) 
     .OrderByDescending(car => car.UserVote.Count) 
     .Take(count); 
} 

此代碼僅查看Cars和UserVote表,並未查看User上的ignoreUser字段。我試圖更新我的實體框架代碼加入到用戶表,但我沒有任何成功。最終,我正在尋找獲得由UserVotes數量排序的Cars列表,不包括IgnoreUser設置爲true的列表。在上面的例子中,我希望該方法以正確的順序返回IQueryable(本田思域,然後是雪鐵龍C2)。

我想我想採取汽車,然後離開加入此用戶內部與UserVote加入?這可能與實體框架?

這個問題是根據在評論中給出的建議給出的previous question

回答

2

如果你在你的UserVote實體User導航屬性,那麼你的查詢可能是這樣:

public IQueryable<Car> GetTopCars(int count) 
{ 
    return (from c in context.Car 
      let userVotes=car.UserVote.Where(uv=>!uv.User.IgnoreUser).Count() 
      where userVotes > 0 
      orderby userVotes 
      select c) 
      .Take(count); 
} 

如果你想用剛剛加入操作,那麼你可以這樣做是爲了做到這一點:

public IQueryable<Car> GetTopCars(int count) 
{ 
    return (from c in context.Car 
      let userVotes=(from uv in c.UserVotes 
          join u in context.Users on uv.UserId equals u.Id into users 
          where u=>!u.IgnoreUser 
          select u).Count() 
      where userVotes > 0 
      orderby userVotes 
      select c 
      ) 
      .Take(count); 
} 
+0

當我在連接操作中使用第二個選項時,我得到了重複的汽車返回 - 每個投票一個。此外,用戶投票總是等於我認爲是由於內部聯接? – psych

+0

我會嘗試修復第二個變體,您是否可以不使用第一個解決方案,我相信它的工作原理。 – octavioccl

+0

@psych,我解決了它,但我強烈建議使用第一個解決方案,如果可以的話。恕我直言,它更清潔 – octavioccl