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)
我没有收到任何错误,但我没有选择正确的列。事实上,那一刻我不确定我在选择什么。另外我收到错误:
非静态方法需要一个目标。
如果您想选择经理,那么您需要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)