linq для двух таблиц на основе dotvvm - PullRequest
0 голосов
/ 26 апреля 2018

Я недавно начал изучать C # и DotVVM, и я столкнулся с проблемой. Я не знаю, как сделать запрос linq из двух таблиц. Я знаю, как сделать запрос или linq для одной таблицы, но я застрял с двумя таблицами.

Моя база данных авторов

CREATE TABLE [dbo].[Autors] (
[ID]              INT            IDENTITY (1, 1) NOT NULL,
[Jmeno]           NVARCHAR (MAX) NULL,
[Prijmeni]        NVARCHAR (MAX) NULL,
[ProstredniJmeno] NVARCHAR (MAX) NULL,
[Narozeni]        DATE           DEFAULT (NULL) NULL,
[Umrti]           DATE           DEFAULT (NULL) NULL,
[Bio]             NVARCHAR (MAX) NULL,
[Narodnost]       NVARCHAR (MAX) NULL,
[Obrazek]         NVARCHAR (MAX) NULL,
CONSTRAINT [PK_dbo.Autors] PRIMARY KEY CLUSTERED ([ID] ASC));

И моя база данных книг

CREATE TABLE [dbo].[Books] (
[Id]         INT            IDENTITY (1, 1) NOT NULL,
[Nazev]      NVARCHAR (MAX) NOT NULL,
[IdAutor]    INT            NOT NULL,
[Popis]      NVARCHAR (MAX) NULL,
[Isbn]       NCHAR (15)     NULL,
[IdZanr]     INT            NULL,
[RokVydani]  INT            NULL,
[PocetStran] INT            NULL,
[Obrazek]    TINYINT        NULL,
CONSTRAINT [PK_dbo.Books] PRIMARY KEY CLUSTERED ([Id] ASC));

И мне нужно создать запрос linq, чтобы получить это

namespace AbsolvetnskaPrace.Models
{
   public class AutorListModel
    {
        public int Id { get; set; }
        public string Jmeno { get; set; }       //First name
        public string Prijmeni { get; set; }    //Last name
    }
}


namespace AbsolvetnskaPrace.Models
{
    public class BookListModel
    {
        public int Id { get; set; }
        public string Nazev { get; set; }            //Title
        public int IdAutor { get; set; }
        public string JmenoAutor { get; set; }       //Author's first name
        public string PrijmeniAutor { get; set; }    //Author's last name
    }
}

У меня есть класс Сервисов, где у меня есть все запросы linq, которые я использую. Мне нужно составить список книг, но получить имя и фамилию автора.

Это вид списка:

<div class="page-center">
        <div class="page-grid-top">
            <div class="student-image"></div>
            <h1>{{resource: Texts.Title_BookList}}</h1>
            <dot:AuthenticatedView>
                <dot:RouteLink Text="{resource: Texts.Label_NewBook}" RouteName="CRUD_BookCreate" class="page-button btn-add btn-long" />
            </dot:AuthenticatedView>
        </div>
        <dot:GridView DataSource="{value: Books}" class="page-grid">
            <Columns>
                <dot:GridViewTextColumn ValueBinding="{value: Nazev}" HeaderText="{resource: Texts.Label_Title}" />

                <dot:GridViewTextColumn ValueBinding="{value: IdAutor}" HeaderText="{resource: Texts.Label_BookAutor}" />

                <dot:GridViewTemplateColumn>
                    <dot:RouteLink Text="{resource: Texts.Label_Detail}" RouteName="CRUD_BookDetail" Param-Id="{{value: Id}}" />
                </dot:GridViewTemplateColumn>
                <dot:GridViewTemplateColumn>
                    <dot:RouteLink Text="{resource: Texts.Label_Edit}" RouteName="CRUD_BookEdit" Param-Id="{{value: Id}}" />
                </dot:GridViewTemplateColumn>
            </Columns>

            <EmptyDataTemplate>
                {{resource: Texts.EmptyAutorTable}}
            </EmptyDataTemplate>
        </dot:GridView>
    </div> 

И, наконец, результат выглядит следующим образом , но числа в "Jméno a příjmení autora" следуют по имени и фамилии Автора. Сейчас это Идентификатор автора.

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

1 Ответ

0 голосов
/ 26 июня 2018

в ваших классах (объектно-каркасной модели) отсутствуют свойства навигации. Вы должны добавить свойства, как это:

namespace AbsolvetnskaPrace.Models
{
   public class AutorListModel
    {
        public int Id { get; set; }
        public string Jmeno { get; set; }       //First name
        public string Prijmeni { get; set; }    //Last name
-->        pubilc ICollection<BookListModel> BookListModels { get; set; } 
    }
    public class BookListModel
    {
        public int Id { get; set; }
        public string Nazev { get; set; }            //Titleenter code here
        public int IdAutor { get; set; }
-->        public AutorListModel Author { get; set; }
        public string JmenoAutor { get; set; }       //Author's first name
        public string PrijmeniAutor { get; set; }    //Author's last name
    }
}

Тогда ваш запрос linq может выглядеть так:

context.Books.Include(a=> a.Authors).Where( -- lambda condition --).Select( -- lambda transformation --).ToList()

DotVVM сериализует объекты в ViewModel, поэтому настоятельно рекомендуется преобразовать ваши EF-классы в DTO (объекты передачи данных), которые не имеют логики, и их основная цель - передавать данные и ничего больше.

...