FirstOrDefault如何用条件评估内部FirstOrDefault?

时间:2011-05-05 00:45:01

标签: c# asp.net linq-to-sql

我有这个问题,FirstOrDefault总是返回它遇到的第一个项目,无论内部表达式如何评估。

假设我有一系列公司。

Companies = {Company1, Company2, Company3}

..并且每家公司都包含一系列员工姓名。

Company1.EmployeeList = {"Employee1", "Employee2"}
Company2.EmployeeList = {"Employee3", "Employee4"}
Company3.EmployeeList = {"Employee5", "Employee6"}

为什么我总是收到第一家拥有以下代码的公司?

var myCompany = Companies.FirstOrDefault(c=> c.EmployeeList.FirstOrDefault(name => name == "Employee3") != null);

1 个答案:

答案 0 :(得分:6)

我运行此代码:

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

结果是:

String [] (2 items)  
  Employee3
  Employee4

你的例子不是在讲述整个故事吗?

  • Company1
  • 中的Employee3 EmployeeList是否有Employees
  • 我看到你正在使用LINQ-to-SQL,如果这是正确的,你如何在一个字符串数组的LINQ-to-SQL模型上有一个属性?您是否添加了扩展方法/部分方法来创建此数组?
  • String实际上不是==(即Any是否过载或类似)

首先,我建议您更改代码以使用FirstOrDefault != null而不是var myCompany = Companies .FirstOrDefault(c => c.EmployeeList.Any(name => name == "Employee3"));

FirstOrDefault

我还注意到你声明:

  

FirstOrDefault总是返回   它遇到的第一个项目,无论如何   如何评估内在表达

如果是这种情况,要么以某种方式(不太可能)重载EmployeeList,要么对于您尝试的每个示例,您的内部表达总是为真(即在示例中,Company你的第一个== "Employee3"有一个list.Contains(item)为真的元素。

修改

评论中的两条很棒的建议:

  1. 使用list.Any(el => el == item)而不是var myCo = Companies.FirstOrDefault(c => c.EmployeeList.Contains("Employee3")); 来构建ingo,这意味着使用:

    Employee
  2. John L建议EmployeeList中的项目(default(Employee)?)是值类型或类似内容,因此null不是{{1}}。