C# FirstOrDefault() 即使使用 System.Linq 也无法正常工作

C# FirstOrDefault() not working even with using System.Linq

此处为C#初学者:我只想查看有与当前用户年龄相同的员工的设施。

出于某种原因 FirstOrDefault() 下面有一条红线:

'Facility' 不包含 'FirstOrDefault' 的定义,并且找不到接受类型 'Facility' 的第一个参数的可访问扩展方法 'FirstOrDefault' (您是否缺少 using 指令或程序集引用?

这是一行:

facilities = facilities.Where(facility => facility.Employee.FirstOrDefault().Age == (int)HttpContext.User.GetAge());

在文件的顶部,我有“using System.Linq”,我知道这是有效的,因为没有它就会在 Where 上出错。所以,我想知道还有什么可能导致此问题?

试试这个。首先,您需要根据谓词过滤值序列,然后 return 序列的第一个元素。 Read more here

facilities = facilities.Where(facility => facility.Employee.Age == (int)HttpContext.User.GetAge()).FirstOrDefault();

这样更易读,

var userAge = (int)HttpContext.User.GetAge();
facilities = facilities.Where(facility => facility.Employee.Age == userAge).FirstOrDefault();

同意@Metro,你可以简单地使用,

var userAge = (int)HttpContext.User.GetAge();
var facility = facilities.FirstOrDefault(facility => facility.Employee.Age == userAge);

您已经在迭代 facilities 并且我相信 Employee 属性 与 Facility class 具有一对一关系,即 Employee 不是列表.

下面的代码就可以工作

var emp_age = HttpContext.User.GetAge() as int;
facilities = facilities.Where(facility => facility.Employee.Age == emp_age);

错误是因为 facility.Employee 没有实现 FirstOrDefault 方法。可能不是 List/IEnumerable(或一般的 ICollection)。

您可以先按年龄比较,然后使用 FirstOrDefault

int age = (int)HttpContext.User.GetAge();
facilities = facilities.Where(facility => facility.Employee.Age == age).FirstOrDefault();

假设facility.Employee是列表类型:

var userAge = (int)HttpContext.User.GetAge();
facilities.Where(facility => facility.Employee.Any(e => e.Age.Equals(userAge)));

如果不是并且每个设施只有一名员工,则

var userAge = (int)HttpContext.User.GetAge();
facilities.Where(facility => facility.Employee == userAge);