Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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# ASP.NET MVC Select和Where语句_C#_Asp.net Mvc_Linq - Fatal编程技术网

C# ASP.NET MVC Select和Where语句

C# ASP.NET MVC Select和Where语句,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我无法理解.Select和.Where语句。我要做的是根据另一列选择一个特定列,其中包含where条件 例如,我所拥有的是: var engineers = db.engineers; var managers = db.ManagersToEngineers; List<ManagerToEngineer> matchedManager = null; Engineer matchedEngineer = null; if (this.User.Identity.IsAuthen

我无法理解.Select和.Where语句。我要做的是根据另一列选择一个特定列,其中包含where条件

例如,我所拥有的是:

var engineers = db.engineers;
var managers = db.ManagersToEngineers;
List<ManagerToEngineer> matchedManager = null;
Engineer matchedEngineer = null;

if (this.User.Identity.IsAuthenticated)
{
    var userEmail = this.User.Identity.Name;
    matchedEngineer = engineers.Where(x => x.email == userEmail).FirstOrDefault();
    matchedManager = managers.Select(x => x.ManagerId).Where(x => x.EngineerId == matchedEngineer.PersonId).ToList();
}
if (matchedEngineer != null)
{
    ViewBag.EngineerId = new SelectList(new List<Engineer> { matchedEngineer }, "PersonId", "FullName");
    ViewBag.ManagerId = new SelectList(matchedManager, "PersonId", "FullName");
}
我没有得到任何错误,但我没有选择正确的列。事实上,此刻我不确定我在选择什么。另外,我得到的错误是:

非静态方法需要一个目标


要通过匹配人员Id然后选择经理Id筛选数据,需要执行以下操作:

matchedManager = managers.Where(x => x.EngineerId == matchedEngineer.PersonId).Select(x => x.ManagerId).ToList();
在本例中,您首先选择ManagerId,因此您有int列表,而不是可以从中筛选数据的管理器

更新:
在检索关联的管理器之前,还需要检查matchedEngineer是否不为null。这可能是错误的原因

如果要通过匹配人员Id然后选择经理Id来筛选数据,则需要执行以下操作:

matchedManager = managers.Where(x => x.EngineerId == matchedEngineer.PersonId).Select(x => x.ManagerId).ToList();
在本例中,您首先选择ManagerId,因此您有int列表,而不是可以从中筛选数据的管理器

更新:
在检索关联的管理器之前,还需要检查matchedEngineer是否不为null。这可能是错误的原因

您使用Select lambda expression获取所需字段,您使用where筛选结果

您使用Select lambda expression获取所需字段,您使用where筛选结果

如果您要选择管理器,则需要使用FirstOrDefault,因为您使用了上面的一行,但如果希望返回多个管理器,则需要列表,请尝试以下操作:

更新: 因此matchedManager已经是列表,在这种情况下,它应该是:

matchedManager = managers.Where(x => x.EngineerId == matchedEngineer.PersonId).ToList();
当您将Selectx=>x.ManagerId放在Where now之后时,它将返回int集合而不是该类型的集合,并且由于Where是自描述性的,所以它会像在sql中一样过滤集合,并选择将集合投影到指定的列上:

List<int> managerIds = managers.Where(x => x.EngineerId == matchedEngineer.PersonId)
                         .Select(x=>x.ManagerId).ToList();

如果要选择管理器,则需要使用FirstOrDefault,就像使用上面的一行一样,但如果预期将返回多个管理器,则需要列表,如:

更新: 因此matchedManager已经是列表,在这种情况下,它应该是:

matchedManager = managers.Where(x => x.EngineerId == matchedEngineer.PersonId).ToList();
当您将Selectx=>x.ManagerId放在Where now之后时,它将返回int集合而不是该类型的集合,并且由于Where是自描述性的,所以它会像在sql中一样过滤集合,并选择将集合投影到指定的列上:

List<int> managerIds = managers.Where(x => x.EngineerId == matchedEngineer.PersonId)
                         .Select(x=>x.ManagerId).ToList();

要记住这些方法所做的事情,最简单的方法就是记住这些方法正在被转换为SQL

Where方法将过滤返回的行

Select方法将筛选返回的列

但是,有几种方法可以通过设置对象的方式实现这一点

首先,您可以找到工程师,并访问其经理:

var engineer = context.Engineers.Find(engineerId);
return engineer.Managers;
然而,这将首先将工程师从数据库中拉出来,然后再返回给所有经理。另一种方法是直接通过经理

return context.Managers.Where(manager => manager.EngineerId == engineerId).ToList();

尽管如此,从您问题中的代码来看,您可能有一个交叉引用表—经理和工程师之间的多对多关系。在这种情况下,我的第二个例子可能不起作用。在这种情况下,我将使用第一个示例。

记住这些方法所做的最简单的方法是记住这些方法正在被转换为SQL

Where方法将过滤返回的行

Select方法将筛选返回的列

但是,有几种方法可以通过设置对象的方式实现这一点

首先,您可以找到工程师,并访问其经理:

var engineer = context.Engineers.Find(engineerId);
return engineer.Managers;
然而,这将首先将工程师从数据库中拉出来,然后再返回给所有经理。另一种方法是直接通过经理

return context.Managers.Where(manager => manager.EngineerId == engineerId).ToList();

尽管如此,从您问题中的代码来看,您可能有一个交叉引用表—经理和工程师之间的多对多关系。在这种情况下,我的第二个例子可能不起作用。在这种情况下,我将使用第一个示例。

您的答案似乎是我认为最接近的答案,但我不想要一个int Id列表,而是想要一个与Id关联的经理名称列表。我尝试使用list and.Selectx=>x.manager.ToList;相反,尽管表中有匹配的数据,但编译后的结果是空的。这对我来说毫无意义。事实上,尽管它不是空的,我数了2个项目,但它没有显示名称。呃。我想你的答案似乎是最接近的答案,但我不想要一个int Id列表,而是想要一个与Id关联的经理姓名列表。我尝试使用list and.Selectx=>x.manager.ToList;相反,尽管表中有匹配的数据,但编译后的结果是空的。这对我来说毫无意义。事实上,尽管它不是空的,我数了2个项目,但它没有显示名称。呃。