Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有人能帮我理解下面这句话吗?_C#_Asp.net Mvc_Model View Controller - Fatal编程技术网

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