【问题标题】:Linq Select Statements - Where Not InLinq Select 语句 - 不在的地方
【发布时间】:2009-06-18 20:42:04
【问题描述】:

我正在尝试编写相当于以下内容的 LINQ 语句:

select e.EmployeeID, EmployeeName = e.FirstName + ' ' + e.LastName
from Employees e
where e.EmployeeID not in
(
    select EmployeeID from Managers
)

我认为我与以下内容非常接近:

from e in Employees
where e.EmployeeID !=    // This is where I'm lost
(
    from m in Managers select m.EmployeeID
)
select new
{
    e.EmployeeID,
    EmployeeName = e.FirstName + ' ' + e.LastName
}

我正在尝试将其放入 Html.DropDownList。

【问题讨论】:

    标签: asp.net-mvc linq


    【解决方案1】:

    我不太确定正确的查询表示法是什么,但下面的扩展语法将完成这项工作

    var result = Employees
      .Where( e => !Managers.Where(m => m.EmployeeId == e.EmployeeId).Any())
      .Select( e => new { EmployeeId = e.EmployeeId, EmployeeName = e.FirstName + ' ' + e.LastName);
    

    【讨论】:

    • 虽然这确实有效,但应该注意的是,根据查询的执行和(未)优化方式,它可能性能很差。
    • @emaster70,我认为描述它的最佳方式是它具有大 O 表示法的 E*M 性能。
    【解决方案2】:

    使用Any

    from e in Employees
    where !Managers.Any(m => m.EmployeeID == e.EmployeeID)
    select new
    {
        e.EmployeeID,
        EmployeeName = e.FirstName + ' ' + e.LastName
    }
    

    或者,使用左连接:

    from e in Employees
    join m in Managers on e.EmployeeID equals m.EmployeeID into managerGroup
    from m in managerGroup.DefaultIfEmpty()
    where m == null
    select new
    {
        e.EmployeeID,
        EmployeeName = e.FirstName + ' ' + e.LastName
    }
    

    【讨论】:

      【解决方案3】:

      你可以通过fluid implementation of Linq.Except()得到你想要的结果:

      List<Employee> employees = new List<Employee>
          {
              new Employee { EmployeeID = 1, FirstName = "John", LastName = "Smith" },
              new Employee { EmployeeID = 2, FirstName = "Jane", LastName = "Doe" },
              new Employee { EmployeeID = 3, FirstName = "Eddie", LastName = "Punchclock" }
          };
      List<Employee> managers = new List<Employee>
          {
              new Employee { EmployeeID = 2, FirstName = "Jane", LastName = "Doe" },
          };
      var nonManagerEmployees = employees.Except(managers, x => x.EmployeeID)
          .Select(x => new
              {
                  x.EmployeeID,
                  EmployeeName = x.FirstName + " " + x.LastName
              });
      
      foreach(var entry in nonManagerEmployees)
      {
          Console.WriteLine(entry.EmployeeID+" "+entry.EmployeeName);
      }
      

      输出:

      1 John Smith
      3 Eddie Punchclock
      

      【讨论】:

        【解决方案4】:

        使用 .Contains() 方法并插入一个 !创建一个 NOT 样式语法。

        这将是 {collection}.Contains(this != to that);

        您可能也对此感兴趣:http://srtsolutions.com/blogs/billwagner/archive/2006/04/10/linq-samples-part-11.aspx

        【讨论】:

          【解决方案5】:

          这是一篇关于在 LINQ 中使用 IN 语句的文章。我相信你可以稍微修改一下技巧来做一个 NOT IN。

          http://blogs.msdn.com/alexj/archive/2009/03/26/tip-8-writing-where-in-style-queries-using-linq-to-entities.aspx

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-12-08
            • 2011-09-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-02-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多