0

我最近开始学习 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”中的数字按 Autor 的名字和姓氏排列。现在是作者的ID。

我知道这个问题真的很长,但我会很感激你能给我的任何建议。

4

1 回答 1

0

您的类(实体框架模型)缺少导航属性。您必须添加如下属性:

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(数据传输对象),其主要目的是传输数据,仅此而已。

于 2018-06-26T09:34:38.263 回答