C# 有人能帮我理解下面这句话吗?
C# 有人能帮我理解下面这句话吗?,c#,asp.net-mvc,model-view-controller,C#,Asp.net Mvc,Model View Controller,ctx是DataAccess对象,schoolsList是DataAccess类型的属性List。我理解S和写着x=>x.id==id的部分,但是this.schoolsList.Contains(x.school\u id)的部分对我来说毫无意义。我知道x=>x.id==id返回与作为参数传入的id相匹配的团队对象,但是this.schoolsList.Contains(x.school\u id)究竟是如何工作的?我如何才能使用学校id属性(团队班级的属性) 谓词的第一部分(x=>x.id=
ctx
是DataAccess
对象,schoolsList
是DataAccess
类型的属性List
。我理解S和写着x=>x.id==id
的部分,但是this.schoolsList.Contains(x.school\u id)
的部分对我来说毫无意义。我知道x=>x.id==id
返回与作为参数传入的id相匹配的团队对象,但是this.schoolsList.Contains(x.school\u id)
究竟是如何工作的?我如何才能使用学校id
属性(团队班级的属性)
谓词的第一部分(x=>x.id==id
)是否返回团队对象,然后第二部分使用返回对象的学校id?出于某种原因,这似乎是一种奇怪的工作方式,因为我认为Where()
方法中的所有内容都返回了一些东西,而不是每个条件都返回一些东西
有人能帮我理解下面这句话吗
它多次调用Include()
方法,该方法返回此
(同一对象),因此可以再次调用它
然后它使用LINQ查询(似乎IEnumerable继承)在lambda中按条件查找特定元素
FirstOrDefault()
返回第一个匹配元素(如果有)或null
(default(T)
)。回答你原来的问题
Lambda条件是一个简单的if
表达式,用于IEnumerable
项。每次调用Lambda以返回true
或false
,FirstOrDefault()
将枚举内部数组以确定项是否匹配
有人能帮我理解下面这句话吗
它多次调用Include()
方法,该方法返回此
(同一对象),因此可以再次调用它
然后它使用LINQ查询(似乎IEnumerable继承)在lambda中按条件查找特定元素
FirstOrDefault()
返回第一个匹配元素(如果有)或null
(default(T)
)。回答你原来的问题
Lambda条件是一个简单的
if
表达式,用于IEnumerable
项。每次调用Lambda以返回true
或false
,FirstOrDefault()
将枚举内部数组以确定项是否匹配。contains方法通过IN子句转换为SQL。假设列表包含3个项目1、2、3,然后将其转换为
public Team getTeamByID(int id)
{
Team team = ctx.Teams.Include("Login").Include("People").Include("School").Where(x => x.id == id && this.schoolsList.Contains(x.school_id)).FirstOrDefault();
///
}
看看生成的sql,比如intellisense,如果你有VS ultimate,它会显示出来,事情会变得可以理解。
否则看看这个
我以我自己为例:
where team.school_id in (1,2,3)
转化为
string[] roles = {"admin","medewerker"};
_medewerkers = contactPersoonRepository
.Query(c => c.Bedrijf.BEDRIJF_TYPE.Contains("P") && roles.Contains(c.CP_ROLE))
.NoTracking()
.OrderBy(q => q.OrderBy(d => d.CP_NAAM))
.Select(b => new Medewerker
{
Naam = b.CP_NAAM,
VoorNaam = b.CP_VOORNM,
Id = b.CP_CPID,
Rol = b.CP_ROLE,
Uurloon = b.CP_UURLOON
}).ToList();
相关部分如下:
USE [Jogical];
GO
SELECT
[Extent1].[CP_CPID] AS [CP_CPID],
[Extent1].[CP_NAAM] AS [CP_NAAM],
[Extent1].[CP_VOORNM] AS [CP_VOORNM],
[Extent1].[CP_ROLE] AS [CP_ROLE],
[Extent1].[CP_UURLOON] AS [CP_UURLOON]
FROM [dbo].[ContactPersoon] AS [Extent1]
INNER JOIN [dbo].[Bedrijf] AS [Extent2] ON [Extent1].[CP_BEDRIJFID] = [Extent2].[BEDRIJF_ID]
WHERE ([Extent2].[BEDRIJF_TYPE] LIKE N'%P%') AND ([Extent1].[CP_ROLE] IN (N'admin', N'medewerker')) AND ([Extent1].[CP_ROLE] IS NOT NULL)
ORDER BY [Extent1].[CP_NAAM] ASC
它来自contains调用
请注意,当应用于字符串时,contains的转换方式是如何不同的。EF不是很棒吗;-) contains方法通过IN子句转换为SQL。假设列表包含3个项目1、2、3,然后将其转换为
public Team getTeamByID(int id)
{
Team team = ctx.Teams.Include("Login").Include("People").Include("School").Where(x => x.id == id && this.schoolsList.Contains(x.school_id)).FirstOrDefault();
///
}
看看生成的sql,比如intellisense,如果你有VS ultimate,它会显示出来,事情会变得可以理解。
否则看看这个
我以我自己为例:
where team.school_id in (1,2,3)
转化为
string[] roles = {"admin","medewerker"};
_medewerkers = contactPersoonRepository
.Query(c => c.Bedrijf.BEDRIJF_TYPE.Contains("P") && roles.Contains(c.CP_ROLE))
.NoTracking()
.OrderBy(q => q.OrderBy(d => d.CP_NAAM))
.Select(b => new Medewerker
{
Naam = b.CP_NAAM,
VoorNaam = b.CP_VOORNM,
Id = b.CP_CPID,
Rol = b.CP_ROLE,
Uurloon = b.CP_UURLOON
}).ToList();
相关部分如下:
USE [Jogical];
GO
SELECT
[Extent1].[CP_CPID] AS [CP_CPID],
[Extent1].[CP_NAAM] AS [CP_NAAM],
[Extent1].[CP_VOORNM] AS [CP_VOORNM],
[Extent1].[CP_ROLE] AS [CP_ROLE],
[Extent1].[CP_UURLOON] AS [CP_UURLOON]
FROM [dbo].[ContactPersoon] AS [Extent1]
INNER JOIN [dbo].[Bedrijf] AS [Extent2] ON [Extent1].[CP_BEDRIJFID] = [Extent2].[BEDRIJF_ID]
WHERE ([Extent2].[BEDRIJF_TYPE] LIKE N'%P%') AND ([Extent1].[CP_ROLE] IN (N'admin', N'medewerker')) AND ([Extent1].[CP_ROLE] IS NOT NULL)
ORDER BY [Extent1].[CP_NAAM] ASC
它来自contains调用
请注意,当应用于字符串时,contains的转换方式是如何不同的。EF不是很棒吗;-)
通过这一行,您将检索满足Where
子句要求的ctx.Teams
的第一个元素
Team team = ctx.Teams
.Include("Login")
.Include("People")
.Include("School")
.Where(x => x.id == id
&& this.schoolsList.Contains(x.school_id))
.FirstOrDefault();
这里您可以通过ctx
从数据库调用表Teams
Include
语句用于联接其他表,如SQL中的联接,并检索联接表中的数据
ctx.Teams
在这里,您正在筛选表数据,其中该行具有变量id
中的id,并且位于schoolsList
内
FirstOrDefault()
检索Where
子句返回的IQueryable
中的第一项
这也可以转化为:
.Where(x => x.id == id
&& this.schoolsList.Contains(x.school_id))
像这样编写的包含更少像bug,更多是面向对象的。为此,您需要以下名称空间System.Data.Entity
**编辑1**
我有点理解,但不完全理解。它怎么知道是什么 x、 学校id是多少?我以为我已经把它包括在我的问题里了,但我只是 在中编辑了它,传入该函数的唯一参数是 “id.”那么x.school\u id的值到底传递到哪里 你是从哪里来的?是否来自从返回的团队对象 条件x.id==id?-霜冻 因为
Where
子句或FirstOrDefault
通过ctx.Teams
对SQL进行迭代,其中Teams
类包含属性school\u id
这只有在EntityFramework中才可能,其中表由类表示,类属性是表列
啊!!当您执行this.schoolsList.Contains(x.school\u id)
时,您正在调用由Where
引起的每个“SQL迭代”的列表schoolsList
这就像做:
Team team = ctx.Teams
.Include(x => x.Login)
.Include(x => x.People)
.Include(x => x.School)
.FirstOrDefault(x => x.id == id
&& this.schoolsList.Contains(x.school_id));
List teams=ctx.teams
.包括(“登录”)
.包括(“人”)
.包括(“学校”)
.ToList();
团队=空;
foreach(团队中的var项目)
{
if(item.id==id&&this.schoolsList.Contains(item.school\u id))
{
团队=项目;
打破
}
}
通过这一行,您将检索满足Where
子句要求的ctx.Teams
的第一个元素
Team team = ctx.Teams
.Include("Login")
.Include("People")
.Include("School")
.Where(x => x.id == id
&& this.schoolsList.Contains(x.school_id))
.FirstOrDefault();
在这里,您可以通过从数据库调用表Teams