从linq查询中获取价值(需要想法/建议)

Emm*_*kwu 1 c# linq

我需要帮助以从linq查询中获取价值。使用firstordefault()

var item = (from o in db.Employee
                    join a in db.EmployeeLineManager on o.Id equals a.EmployeeID
                    where o.Id == Id
                    select new
                    {
                        AddedBy = o.LastName + " " + o.FirstName,
                        LineManagerId = a.LineManagerId,
                        Email = o.Email
                    }).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

我可以获取项目中的内容(例如,如果我想获取电子邮件,可以使用item.Email)

但是,如果我使用ToList()

var item = (from o in db.Employee
                    join a in db.EmployeeLineManager on o.Id equals a.EmployeeID
                    where o.Id == Id
                    select new
                    {
                        AddedBy = o.LastName + " " + o.FirstName,
                        LineManagerId = a.LineManagerId,
                        Email = o.Email
                    }).ToList();
Run Code Online (Sandbox Code Playgroud)

我如何从商品中获取价值(例如,我想获取电子邮件,item.Email不起作用,请问我可以用什么来获取价值?

Dav*_*vid 5

在第一个示例中,item是单个对象。在第二个示例中,它是对象列表。(顾名思义,ToList将结果转换列表。)

List<T>没有名为的属性Email。但是它确实包含零个或多个在这种情况下可以使用的元素。

因此,您可以执行以下操作:

item.FirstOrDefault().Email
Run Code Online (Sandbox Code Playgroud)

也许:

item[0].Email
Run Code Online (Sandbox Code Playgroud)

或者您可以遍历列表等。

请记住以下几点:

  1. item这是错误的名称。这是一个集合,所以称它为items。变量名称对于您理解自己的代码很重要。
  2. 该列表可能为空,在这种情况下,以上两个示例用法都将引发异常。您应该始终进行一些null检查。例如:

    items.FirstOrDefault()?.Email
    
    Run Code Online (Sandbox Code Playgroud)

  • 关于空检查,在这里异常可能是期望的结果。但是您会希望得到一个清晰的异常消息(和/或类型),而不是一个空引用异常,它不会告诉使用者确切的_what_错误。因此,仍然需要检查+清除消息,但这并不意味着您需要整体上避免异常。 (2认同)