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();

我没有得到任何错误,但我没有选择正确的列。事实上,在我不确定要选什么的时候。加上我得到错误:

非静态方法需要目标。

ASP.NET MVC C# Select and Where Statements

如果您想选择管理器,那么您需要使用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"来过滤结果