Linq - 引用子表

时间:2011-09-12 19:25:09

标签: linq asp.net-mvc-3 razor

我正在处理一些关于“目标”应用程序的表格(屏幕抓取在下面)。我正在使用MVC 3,razor和linq。

我正在使用一个模型goalModel来检索我的数据:

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视为目标之子

我有一个goalModel.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();
    }

在我的创建活动部分视图中,我只能访问目标模型:

@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....

在我看来,我需要访问ilpActivities的activityName - 但唯一的选项来自目标表。

2 个答案:

答案 0 :(得分: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);返回IEnumerable的活动,而不是像前一个方法那样的单个目标。

答案 1 :(得分:0)

我不确定我发布的方法是否是Linq,但我一直使用Entity Framework进行数据连接。

首先,在数据模型中,您应该在两个表之间创建关联,当您创建关联时,您现在可以轻松地包含来自两个表的数据。

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