Linq - ссылка на дочерний стол - PullRequest
0 голосов
/ 12 сентября 2011

У меня есть несколько таблиц, с которыми я имею дело относительно приложения "Цели" (скриншот ниже). Я использую MVC 3, бритву и 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 есть первичный ключ actionID.

[Update]

Мои таблицы выглядят примерно так (упрощенно, чтобы включить соответствующие поля): цели: идентификатор цели, имя-цели, цель-цели ilpActivities: ActivityID, targetID, 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....

На мой взгляд, мне нужно получить доступ к ActivityName of ilpActivities - но единственные варианты исходят из таблицы целей.

Ответы [ 2 ]

1 голос
/ 12 сентября 2011

Можно ли изменить:

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 из активностей, а не одну цель, как в предыдущем методе.

0 голосов
/ 13 сентября 2011

Я не уверен, является ли метод, который я публикую, Linq или нет, но я все время использую его с Entity Framework для подключения к данным.

Прежде всего в вашей модели данных вы должны создать ассоциациюмежду двумя таблицами, когда вы создали связь, теперь вы можете легко включить данные из обеих таблиц.

// Include Activities 
public IEnumerable<Goal> GetGoalActivities (int GoalId) {
    qDB.Goal.Include("Activities").Where(w => w.goal_id == GoalId);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...