2012-09-13 106 views
1

隨着SQL我會做以下...實體框架選擇對象

SELECT G.* FROM GOAL G 
INNER JOIN Plan P ON 
P.planID = G.planID 
INNER JOIN User U ON 
U.userID = P.userID 
WHERE U.userID = @userID 

在我的控制器(MVC4)"ActionResult Edit" Im做以下,這是兩個問題,我怎麼能這樣做只有一個?目標是確保用戶只能對他們自己的數據執行「編輯」操作而不是其他人的目標。

var plan = db.Plan.Where(b => b.UserID == CurrentUserID).FirstOrDefault(); 
Goal goal = db.Goals 
      .Where(b => b.PlanID == plan.ID) 
      .FirstOrDefault(); 
return View(goal); 

型號

public class Plan 
{ 
    public int ID { get; set; } 
    [Required] 
    public int UserID { get; set; } 
} 
[Table("PlanGoal")] 
public class Goal 
{ 
    public int ID { get; set; } 

    [Required] 
    public int PlanID { get; set; } 
} 

回答

1

或者你也可以加入目標,而是計劃將屬性添加到您的Goal類在一起:

Goal goal = (from g in db.Goals 
      from p in db.Plan 
      where p.UserID == CurrentUserID 
      && g.PlanID == p.ID 
      select g).FirstOrDefault(); 
+0

我更喜歡這一個,但它不適用於「從計劃中的p」...計劃不解決「它的類型,但它使用像變量」。 – Marc

+0

我認爲這是因爲我忘記在語句中包含上下文('db.')。我更新了我的答案。 –

+0

當然,不知道爲什麼我錯過了。我給你答案,因爲它不需要我改變模型。 – Marc

2

添加虛擬Plan物業的Goal

public class Goal 
{ 
    public int ID { get; set; }   
    public virtual Plan Plan { set;get;}  
    [Required] 
    public int PlanID { get; set; } 
} 

現在你可以查詢它像這樣

Goal goal = db.Goals 
      .Where(b => b.Plan.UserID == CurrentUserID).FirstOrDefault(); 
+1

好極了,這工作,我本來那些虛函數,但有一些額外的FK的顯示出來的問題,將虛擬和重做代碼第一次遷移沒有把FK放回去,你的代碼工作得很好!謝謝! – Marc