【问题标题】:Linq - Referencing a Child TableLinq - 引用子表
【发布时间】:2011-09-12 19:25:09
【问题描述】:

我正在处理一些关于“目标”应用程序的表格(屏幕截图如下)。我正在使用 MVC 3、razor 和 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();
    }

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

@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 - 但唯一的选项来自目标表。

【问题讨论】:

  • 什么是错误.. 它是不是因为 DataContext 在尝试枚举时已经死了而爆炸?
  • 否 - 它没有“看到”我的子表 (ilpActivities) 的内容。因此,当我尝试添加表单字段时:@Html.Editorfor(a => a.ilpActivities.activityName) - “activityName”不会出现在智能标签中
  • 看来您的最终问题与您的观点有关。要将您的子表及其属性传递给您的视图,您需要向视图传递一个模型,该模型在其结构中包含您的子表。请发布一些关于你的表结构的细节,以及你想要传递给视图的模型的结构,以及一些关于你的视图的更详细的代码。如果我们可以看到有关您想要完成的内容以及您的工作内容的详细信息,那么建议如何填充您的模型会容易得多。
  • 是的 - 我试过了 - 不幸的是我无法发布图片。我将尝试使用更多信息编辑我的帖子
  • 当我对此进行深入研究时,似乎我需要(以某种方式)将我的子表包含在我的数据上下文中。 qDB = 新目标数据类数据上下文();将允许我访问 qDB.ilpActivities,但不能访问任何列,例如 qDB.ilpActivities.activityName;

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


【解决方案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 =&gt; g.goalID == id); 返回一个 IEnumerable 活动,而不是像之前的方法那样的单一目标。

【讨论】:

  • 这需要其他型号吗?我考虑了一个活动模型,但这使得将 ilpActivities 表放入目标模型中的能力似乎毫无意义。
  • 将上述内容放在我的目标模型中会引发:错误 1 ​​找不到类型或命名空间名称“ilpActivities”(您是否缺少 using 指令或程序集引用?)
  • 它们与您的数据上下文在同一个命名空间中
  • 对不起 - 那么我错过了一些东西。我的数据上下文是为我生成的。这是我的第一个 MVC 项目,所以很可能我遗漏了一些明显的东西。在我的 dbml 文件中,名称仍然是 ilpActivities .. 但是当我尝试引用它时,我得到了那个错误(在我之前的评论中)。
  • 查看我的 dbml 我发现 ilpActivities 实际上是 ilpActivity。进行上述更改似乎可行。但是,在我看来,我仍然只有可用目标中的字段。如何在我的控制器中调用它以将活动拉入我的模型?
【解决方案2】:

我不确定我发布的方法是否是 Linq,但我一直将它与 Entity Framework 一起用于我的数据连接。

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

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

【讨论】:

  • 这看起来像我的格式 - 我以为是 linq ??? - 不幸的是,在这种情况下,“包含”会引发错误(我将目标更改为目标):错误 1 ​​'System.Data.Linq.Table' 不包含“包含”的定义并且没有扩展可以找到接受“System.Data.Linq.Table”类型的第一个参数的方法“Include”(您是否缺少 using 指令或程序集引用?)
  • 实体框架模型中是否设置了关联和导航?如果您希望能够包含实体,我认为您需要设置一个或两个。然后您可以在包含中使用模型名称或导航属性名称。
  • 您能详细说明一下吗?我需要在哪里使用“.Include”?抱歉 - 我是新手
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多