2012-09-13 135 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