Как отобразить данные из нескольких таблиц с помощью объединения - PullRequest
0 голосов
/ 29 июля 2011

Эксперты,

Теперь я добавил следующий код в TabMasterController

 private CAFMEntities db = new CAFMEntities();

        public ViewResult Index(string sortorder, int? pagesize, int? page)
        {
            int pageSize = pagesize ?? 10;
            if (Request.HttpMethod != "GET")
            {
                page = 1;
                pageSize = 10;
            }
            ViewBag.SelectedPageSize = pageSize;

            ViewBag.CurrentSort = sortorder;
            ViewBag.FirstNameSortParm = String.IsNullOrEmpty(sortorder) ? "FirstName desc" : "";
            ViewBag.LastNameSortParm = sortorder == "LastName" ? "LastName desc" : "LastName";
            ViewBag.DepNameSortParm = sortorder == "depName" ? "depName desc" : "depName";

            var joined = from tm in db.TabMasters
                         join tk in db.TabKeys on tm.colID equals tk.colID
                         join td in db.TabDeps on tk.depID equals td.depID
                         select new { tm.FirstName, tm.LastName, tk.colID, tk.depID, td.depName };
            switch (sortorder)
            {
                case "FirstName":
                    joined = joined.OrderBy(m => m.FirstName);
                    break;
                case "FirstName desc":
                    joined = joined.OrderByDescending(m => m.FirstName);
                    break;
                case "LastName":
                    joined = joined.OrderBy(m => m.LastName);
                    break;
                case "LastName desc":
                    joined = joined.OrderByDescending(m => m.LastName);
                    break;
                case "depName":
                    joined = joined.OrderBy(m => m.depName);
                    break;
                case "depName desc":
                    joined = joined.OrderByDescending(m => m.depName);
                    break;
                default:
                    joined = joined.OrderBy(m => m.FirstName);
                    break;
            }

            int pageIndex = (page ?? 1) - 1;
            int start = (pageIndex * pageSize);
            ViewBag.TotalRecord = joined.Count();
            ViewBag.StartRecord = start + 1;
            ViewBag.EndRecord = ((start + pageSize) >= ViewBag.TotalRecord) ? ViewBag.TotalRecord : (start + pageSize);
            return View(joined.ToPagedList(pageIndex, pageSize));
        }

ОБНОВЛЕНО

namespace MVCMultilingual.Models
{
    public class TabMasterModel 
    {
        [ReadOnly(true)]
        public int colID { get; set; }
        [ReadOnly(true)]
        public int depID { get; set; }
        [DisplayName("FirstName")]
        public string FirstName { get; set; }
        [DisplayName("LastName")]
        public string LastName { get; set; }
        [DisplayName("depName")]
        public string depName { get; set; }
    }
}

и

@model PagedList.IPagedList<MVCMultilingual.Models.TabMasterModel>

но я не знаю, как установить вывод запроса в класс

Следующий код Индекс Страница TabMasterController

@model PagedList.IPagedList<MVCMultilingual.TabMaster>
@using Helper
@{
    ViewBag.Title = "Index";
}
<h2>
    Index</h2>
<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table cellpadding="0" cellspacing="0" width="500">
    <tr class="row-head">
        <td>
            @Html.ActionLink("FirstName", "Index", new { sortOrder = ViewBag.FirstNameSortParm, pagesize = ViewBag.SelectedPageSize })
        </td>
        <td>
            @Html.ActionLink("LastName", "Index", new { sortOrder = ViewBag.LastNameSortParm, pagesize = ViewBag.SelectedPageSize })
        </td>
        <td>
            @Html.ActionLink("depName", "Index", new { sortOrder = ViewBag.DepNameSortParm, pagesize = ViewBag.SelectedPageSize })
        </td>
        <td>
        </td>
    </tr>
    @{
        foreach (var row in Model.Select((item, index) => new { index, item }))
        {
        @Html.Raw(GridHelper.BeginRow(row.index));
        <td>
            @Html.DisplayFor(modelItem => row.item.FirstName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => row.item.LastName)
        </td>
         <td>
            @Html.DisplayFor(modelItem => row.item.depName)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id = row.item.colID }) |
            @Html.ActionLink("Details", "Details", new { id = row.item.colID }) |
            @Html.ActionLink("Delete", "Delete", new { id = row.item.colID })
        </td>
        @Html.Raw(GridHelper.EndRow());
        }
    }
    @Html.Raw(GridHelper.BeginFooter(ViewContext.RouteData.Values["controller"].ToString(), 3, Convert.ToInt16(ViewBag.StartRecord), Convert.ToInt16(ViewBag.EndRecord), Convert.ToInt16(ViewBag.TotalRecord), Convert.ToInt16(Model.PageCount), Convert.ToInt16(Model.PageNumber), Convert.ToInt16(ViewBag.SelectedPageSize), ViewBag.CurrentSort, Model.HasPreviousPage, Model.HasNextPage))
    @Html.Raw(GridHelper.EndFooter())
  </table>

в этом коде я использую следующую строку

@model PagedList.IPagedList<MVCMultilingual.TabMaster>

Теперь я хотел бы добавить TabDep.depName на этой странице, но он выдаст мне ошибку

   @Html.DisplayFor(modelItem => row.item.depName)

Ошибка: MVCMultilingual.TabMaster не содержит определения для depName, и метод расширения depName, принимающий первый аргумент типа MVCMultilingual.TabMaster, не найден (отсутствует директива using или ссылка на сборку?)

Ответы [ 2 ]

0 голосов
/ 29 июля 2011

Как только вы позвоните по этому номеру:

select new { tm.FirstName, tm.LastName, tk.colID, tk.depID, td.depName };

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

Btw. Почему у вас есть таблица соединений? Просто удалите Id в TabKey и сделайте составной первичный ключ ColId и DepId, и ваша модель упростится, потому что у вас будет прямое отношение M: N между TabMaster и TabDep.

0 голосов
/ 29 июля 2011

для начала вам нужно иметь проверку, чтобы убедиться, что присоединились! = 0, тогда вы не будете пытаться использовать данные, когда они не созданы / I.E нет результатов из базы данных. У вас всегда есть сортировщик, поэтому вы всегда будете переключаться. last tabMaster - это ваша модель для таблицы TabMaster. То, что вы создали, - это новая модель, поэтому вам нужно создать ViewModel и заполнить новую модель View данными, а затем перебрать записи в модели представления, и вы обнаружите, что это исправляет проблема

select new MyViewModel{
     fname = tm.FirstName, 
     lname = tm.LastName, 
     ID = tk.colID, 
     DEP = tk.depID, 
     name = td.depName
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...