ASP.NET MVC C# Select and Where Statements
本文关键字:and Where Statements Select NET MVC ASP | 更新日期: 2023-09-27 18:12:14
我理解。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选择经理列表。这不起作用,当我输入:
matchedManager = managers.Where(x => x.EngineerId == matchedEngineer.PersonId).ToList();
我没有得到任何错误,但我没有选择正确的列。事实上,在我不确定要选什么的时候。加上我得到错误:
非静态方法需要目标。
如果您想选择管理器,那么您需要使用FirstOrDefault()
,就像您在上面使用的一行一样,但是如果期望返回多个管理器,那么您将需要List<Manager>
,尝试如下:
更新:
所以matchedManager已经是List<T>
,在这种情况下,它应该像:
matchedManager = managers.Where(x => x.EngineerId == matchedEngineer.PersonId).ToList();
当您将Select(x=>x.ManagerId)
放在Where()
之后,现在它将返回int
的集合而不是该类型的集合,并且由于Where()
是自我描述的,它过滤了sql中的集合,并且Select()
将集合投影到您指定的列上:
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;
但是,这将首先将Engineer从数据库中取出,然后返回所有manager。另一种方法是直接通过经理。
return context.Managers.Where(manager => manager.EngineerId == engineerId).ToList();
虽然,从你的问题中的代码来看,你的可能在经理和工程师之间有一个交叉引用表(多对多关系)。在这种情况下,我的第二个例子可能就行不通了。在这种情况下,我将使用第一个示例。
您希望通过匹配person Id然后选择manager Id来过滤数据,您需要执行以下操作:
matchedManager = managers.Where(x => x.EngineerId == matchedEngineer.PersonId).Select(x => x.ManagerId).ToList();
在您的例子中,您首先选择了ManagerId,因此您有一个整数列表,而不是可以从中筛选数据的管理器
更新:在检索关联的管理器之前,还需要检查matchedEngineer是否为null。这可能是导致错误的原因
您使用"Select" lambda表达式来获得您想要的字段,您使用"where"来过滤结果