Jef*_*eff 2 c# asp.net linq-to-sql
我有这个问题,FirstOrDefault总是返回它遇到的第一个项目,无论内部表达式如何计算.
可以说我有一系列公司.
Companies = {Company1, Company2, Company3}
Run Code Online (Sandbox Code Playgroud)
..和每家公司都包含一系列员工姓名.
Company1.EmployeeList = {"Employee1", "Employee2"}
Company2.EmployeeList = {"Employee3", "Employee4"}
Company3.EmployeeList = {"Employee5", "Employee6"}
Run Code Online (Sandbox Code Playgroud)
为什么我总是收到第一家拥有以下代码的公司?
var myCompany = Companies.FirstOrDefault(c=> c.EmployeeList.FirstOrDefault(name => name == "Employee3") != null);
Run Code Online (Sandbox Code Playgroud)
我运行这段代码:
string[] s1 = new [] {"Employee1", "Employee2"};
string[] s2 = new [] {"Employee3", "Employee4"};
string[] s3 = new [] {"Employee5", "Employee6"};
string[][] s = new [] { s1,s2,s3 };
var result = s.FirstOrDefault(c => c.FirstOrDefault(n => n == "Employee3") != null);
Run Code Online (Sandbox Code Playgroud)
结果是:
String [] (2 items)
Employee3
Employee4
Run Code Online (Sandbox Code Playgroud)
你的榜样不是在讲述整个故事吗?
Company1有Employee3他们的地方EmployeeList?Employees不实际String(即是==过载或类似)首先,我建议您更改代码Any而不是使用FirstOrDefault != null
var myCompany = Companies
.FirstOrDefault(c => c.EmployeeList.Any(name => name == "Employee3"));
Run Code Online (Sandbox Code Playgroud)
我还注意到你陈述:
无论内部表达式如何计算,FirstOrDefault总是返回它遇到的第一个项目
如果是这种情况,要么你FirstOrDefault以某种方式重载(不太可能),要么你的内部表达式对于你尝试过的每个例子都是正确的(例如,在EmployeeList你的第Company一个例子中,你的第一个有一个== "Employee3"真实的元素).
编辑
评论中的两条很棒的建议:
ingo suggets使用list.Contains(item)而不是list.Any(el => el == item)使用以下方法:
var myCo = Companies.FirstOrDefault(c => c.EmployeeList.Contains("Employee3"));
Run Code Online (Sandbox Code Playgroud)John L建议项目(Employee?)in EmployeeList是值类型或类似,但default(Employee)不是null.