2011-09-12 49 views
0

我正在處理有關「目標」應用程序(屏幕抓取如下)的幾個表格。我使用MVC 3,剃鬚刀和linq。Linq - 引用子表

我使用的一個模型,goalsModel,找回我的數據:

public goals GetGoal(int id) { return qDB.goals.Single(g => g.goalID == id); }

我想活動可用,以及...在那裏我可以做這樣的事情:

public goals GetGoalActivities(int id) { return qDB.ilpActivities.Where(g => g.goalID == id); }

但是,這會返回一個錯誤。智能標籤不會顯示任何可用於ilpActivities的列。我已經看到了幾種在控制器中編寫代碼的方法,它是一個linq查詢 - 但如果可能的話,爲了保持一致性,我真的很想使用上面的格式。

下面是我一直試圖遵循的鏈接,可能會做我想做的。但請記住,我最終將編輯現有活動,創建新活動並刪除活動。鏈接:http://geekswithblogs.net/michelotti/archive/2007/12/30/118076.aspx

[編輯] 我無法發佈圖片作爲新用戶。我的表格包括goalID作爲目標的主鍵和ilpActivities中的外鍵。 ilpActivities具有activityID的主鍵。

[更新]

我的表看起來像這樣(簡化爲包括相關領域): 目標:goalID,GOALNAME,goalDescr ilpActivities:activityID,goalID,activityName

我有一個DBML文件:在設計模式下拖動表格後爲我生成的employeeDataClasses.dbml。它承認ilpActivities爲目標

我有一個goalsModel.cs文件孩子:

namespace ILP.Models 
{ 
public class goalsModel 
{ 
    #region services 
    public interface IGoalsService 
    { 
     List<goals> GetAllGoals(string oprID); 
     bool CreateGoal(goals poll); 
     List<ilpGoalStatus> GetStatuses(); 
     goals GetGoal(int id); 
     bool EditGoal(goals poll); 
     List<ilpActivity> GetGoalActivities(goals goal); 
    } 

    public class AssetService : IGoalsService 
    { 
     private goalsDataClassesDataContext qDB; 

     public AssetService() 
     { 
      qDB = new goalsDataClassesDataContext(); 
     } 

     #region IGoalsService Members 
      public List<ilpActivity> GetGoalActivities (goals goal) 
     { 
      IEnumerable<ilpActivity> activities = from g in qDB.goals 
         join a in qDB.ilpActivities on g.goalID equals a.goalID 
         where a.goalID == goal.goalID 
         select a; 

      return activities.ToList(); 
     } 

在我的控制器:

namespace ILP.Controllers 
{ 
public class HomeController : Controller 
{ 

    private goalsModel.IGoalsService qService; 

    public HomeController() 
    { 
     qService = new goalsModel.AssetService(); 
    } 
     [Authorize] 
    public ActionResult _CreateActivity(int goalID) 
    { 
     //var status = qService.GetStatuses(); 
     ViewBag.Status = new SelectList(qService.GetStatuses().ToList(), "goalStatusID", "goalStatus"); 
// not sure what to do here to get activity model in.... 
     return PartialView(); 
    } 

在我創建活動partialview我只獲得了訪問目標模型:

@model ILP.Models.goals 

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")"  type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
<fieldset> 
    <legend>Create an Activity</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.goalName) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.goalName) 
     @Html.ValidationMessageFor(model => model.goalName) 
    </div> 
.... etc.... 

在我看來我需要訪問ilpActivitie的activityName s - 但唯一的選擇是來自目標表。

+1

什麼是錯誤..它是爆炸的,因爲DataContext已經死了,當它試圖枚舉? –

+0

否 - 它不「查看」我的子表(ilpActivities)的內容。因此,當我嘗試添加表單字段時:@ Html.Editorfor(a => a.ilpActivities.activityName) - 「activityName」未出現在智能標記中 –

+0

看來您的最終問題與您的觀點相關。要將您的子表及其屬性傳遞給您的視圖,您需要將視圖傳遞給包含您的子表結構的模型。請張貼一些關於表格結構的細節,以及關於您想要傳遞給視圖的模型的結構,以及一些關於您的視圖的更詳細的代碼。如果我們能看到你想要完成的細節以及你的工作內容,建議如何填充你的模型要容易得多。 – counsellorben

回答

1

您可以更改:

public goals GetGoalActivities(int id) { return qDB.ilpActivities.Where(g => g.goalID == id); } 

到:

public IEnumerable<ilpActivities> GetGoalActivities(int id) { return qDB.ilpActivities.Where(g => g.goalID == id); } 

因爲qDB.ilpActivities.Where(g => g.goalID == id);回報activites的IEnumerable,而不是像以前的方法,一個單一的目標。

+0

這是否需要另一個模型?我想到了一個活動模型,但是這使得將ilpActivities表放入目標模型中的能力看起來毫無意義。 –

+0

在我的goalsModel中放置上述內容:錯誤無法找到類型或名稱空間名稱'ilpActivities'(缺少using指令還是程序集引用?) –

+0

它們與datacontext位於同一名稱空間中 – Joe

0

我不確定我發佈的方法是否是Linq,但我一直使用Entity Framework進行數據連接。

首先,在您的數據模型中,您應該在兩個表格之間創建關聯,創建關聯後,您現在可以輕鬆地包含來自兩個表格的數據。

// Include Activities 
public IEnumerable<Goal> GetGoalActivities (int GoalId) { 
    qDB.Goal.Include("Activities").Where(w => w.goal_id == GoalId); 
} 
+0

這看起來像我的格式 - 我認爲是linq? - 不幸的是,在這種情況下,「include」引發錯誤(我將目標更改爲目標):錯誤'System.Data.Linq.Table '不包含'Include'的定義,沒有擴展方法'Include'接受類型'System.Data.Linq.Table '的第一個參數可以找到(你是否缺少使用指令或程序集引用?) –

+0

您是否設置了一個實體框架模型中的關聯和導航?如果你想能夠包括實體,我認爲你需要有一個或兩個設置。然後,您可以在包含或導航屬性名稱中使用模型名稱。 –

+0

你能否詳細說明一下?我需要在哪裏使用「.Include」?對不起 - 我是新手 –