ASP.NET MVC C# Select 和Where 语句

Nat*_*kle 0 c# linq asp.net-mvc

我无法理解 .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");
}
Run Code Online (Sandbox Code Playgroud)

上面我想做的是从匹配经理和工程师的表中进行选择,并根据工程师的 ID 选择经理列表。这是行不通的,当我这样做时:

matchedManager = managers.Where(x => x.EngineerId == matchedEngineer.PersonId).ToList();
Run Code Online (Sandbox Code Playgroud)

我没有收到任何错误,但我没有选择正确的列。事实上,那一刻我不确定我在选择什么。另外我收到错误:

非静态方法需要一个目标。

Ehs*_*jad 5

如果您想选择经理,那么您需要FirstOrDefault()像上面使用一行一样使用,但是如果预计返回多个经理,那么您将需要List<Manager>,尝试如下:

更新:

所以matchedManager已经是List<T>,在这种情况下它应该是这样的:

matchedManager = managers.Where(x => x.EngineerId == matchedEngineer.PersonId).ToList();
Run Code Online (Sandbox Code Playgroud)

当您放在nowSelect(x=>x.ManagerId)之后时Where(),它将返回 Collection of intnot Collection of that type,并且作为Where()自我描述,它会像 sql 中那样过滤集合,并将Select()集合投影到您指定的列上:

List<int> managerIds = managers.Where(x => x.EngineerId == matchedEngineer.PersonId)
                         .Select(x=>x.ManagerId).ToList();
Run Code Online (Sandbox Code Playgroud)