我正在处理一些关于“目标”应用程序的表格(屏幕抓取在下面)。我正在使用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 - 但唯一的选项来自目标表。
答案 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);
}