【问题标题】:Using the "let" kewword in a LINQ Query with EF 4.3在带有 EF 4.3 的 LINQ 查询中使用“let”关键字
【发布时间】:2012-03-17 19:28:45
【问题描述】:

我有一个我无法弄清楚的简单 LINQ 问题。 我有一张桌子Users 和一张桌子Employees一个用户可以有 0...n 名员工。

我想做这样的事情:

var result = from u in context.users
             where u.UsrId = 2
             let e = u.Employees.First()
             select new 
{
  UserId = u.UsrId,
  FirstName = e.FirstName
};

这当然行不通,因为First() 调用是非法的。 First() 只能出现在 select 的末尾。 同样不起作用的是在以前的查询中选择员工,如下所示:

var employee = from e. in context.Employees.....

...然后说let e = employee 而不是let e = u.Employees().First()

我不确定 let 的使用是否正确。我认为它是用于子查询的。

调用First() 的原因是Employees 表中每个用户的条目不应超过一个。这是设计中的一个错误,我现在必须处理它。所以我只想要第一个。

【问题讨论】:

    标签: c# .net linq entity-framework let


    【解决方案1】:
    var result = from u in context.users
    let e = u.Employees.FirstOrDefault(x => x.bossId == u.UsrId)
    where u.UsrId = 2
    select new  {   UserId = u.UsrId,   FirstName = e.FirstName }; 
    

    只是一个未经测试的提示。

    【讨论】:

    • 嗨;你能帮我理解问题中上面的 LINQ 查询有什么问题吗?你的询问和我的感觉一模一样。
    • 我认为“let”子句是不必要的。否则,您编写的代码与以下代码有什么不同: select new { UserId = u.UsrId, FirstName = u.Employees.FirstOrDefault(x => x.bossId == u.UsrId).FirstName }; ?
    【解决方案2】:

    除了在 LINQ 可查询语句的中间之外,可以使用 First,当将该语句转换为 SQL 时,实际上没有办法构成 First,因为它的行为是抛出错误。然而,FirstOrDefault 可以转换为 Top(1),这就是它转换为 SQL 的方式。这意味着在 SQL 可翻译语句的中间使用 first 并不是真正有效的,但是我相信他们已经允许它作为最后一条语句,因为零结果可以转换为查询执行后的异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 2011-04-01
      相关资源
      最近更新 更多