我最近开始学习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的名字和姓氏所取代的。现在是作者的身份。
我知道这个问题真的很长,但我会感谢你能给我的任何建议。
答案 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(数据传输对象),其主要目的是传输数据,而没有其他目的。