2013-05-26 100 views
1

我想返回我的「類別」表中的所有值,並將其加入我的「類別選擇」表中以顯示所有類別以及指定用戶是否選擇了它們。 一個併發症(我不知道如何處理在LINQ中)是用戶可能已經改變了他對某一特定類別的選擇/取消選擇隨着時間的推移......每一個改變都會記錄在「CategorySelections」表中日期戳。 我在最後的選擇狀態之後。LINQ Select Row with Max date per group

下面的SQL查詢做什麼,我想:

 SELECT cs.UserId, c.CategoryId, m.MaxDate, cs.IsSelected 
    FROM [myDB].[dbo].[Categories] c 
    LEFT JOIN [myDB].[dbo].[CategorySelections] cs 
    ON c.CategoryID = cs.CategoryID AND cs.UserID = 7 
    INNER JOIN 
    (
    SELECT UserId, CategoryId, Max(CreatedOn) as MaxDate 
    FROM [myDB].[dbo].[CategorySelections] 
    GROUP BY UserId, CategoryId 
) m 
    ON cs.UserID = m.UserID AND cs.CategoryID = m.CategoryID AND cs.CreatedOn = m.MaxDate 
    ORDER BY cs.CategoryI 

我需要一些幫助,讓在LINQ這件事。 下面是我的嘗試,它返回所有的選擇,而不僅僅是最後一個類別。

var query = from c in db.Category 
join cs in db.CategorySelection.Where(x => x.UserID == WebSecurity.CurrentUserId) 
on c.CategoryID equals cs.CategoryID into JoinedCategory 
from cs in JoinedCategory.DefaultIfEmpty() 
select new Selection() { CategoryID = c.CategoryID, CategoryName = c.CategoryName  ,IsSelected = cs != null ? cs.IsSelected : false } 

我在MVC工作; 「新選擇()」是指我的模型

回答

1

您可以添加WHERE語句:

where cs.CreatedOn == CategorySelections.Where(t => t.CategoryId == cs.CategoryId).Max(r => r.CreatedOn) 
+0

我想我補充一點,之前的「選擇」。它說「名稱CategorySelections」在當前上下文中不存在。然後我將它改爲「cs」。但它說「不包含Max的定義」 – Basquiat

+0

我想你可能意思是「JoindedCategory」而不是「CategorySelection」?這樣做不會產生錯誤,但也不會返回任何結果。 – Basquiat

+0

我的意思是'db.CategorySelection' – opewix