linq for dotvvm框架上的两个表

时间:2018-04-26 10:30:39

标签: asp.net linq dotvvm

我最近开始学习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> 

最终the result looks like this但是“Jménoapříjmeníautora”中的数字是由Autor的名字和姓氏所取代的。现在是作者的身份。

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

1 个答案:

答案 0 :(得分: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(数据传输对象),其主要目的是传输数据,而没有其他目的。