【问题标题】:using equal and not equal in a linq join在 linq 连接中使用相等和不相等
【发布时间】:2012-05-17 19:39:40
【问题描述】:

我正在尝试将以下 SQL 查询转换为 linq;

select Or.Amount, Usr.Name, Usr.Email
from [order] as Or
left join vw_AllUsers as Usr on Usr.UserId = Or.UserId and Usr.RoleName <> 'Admin'

我找不到在同一个联接中使用 equalnot equal 的方法。 如果 Usr.RoleName 'Admin'Usr.RoleName = 'Admin',则 linq 语句可以这样写

var result =  from Or in context.orders
              join Usr in context.vw_AllUsers on 
              new { userid = Or.UserId, role = "Admin"}
              equals
              new { userid = Usr.UserId, role = Usr.RoleName}
              select ........

或者我可以在 linq 的一部分中处理它以获得相同的结果,如下所示

where !Usr.RoleName.Equals("Admin")

但是是否可以在 linq 的连接部分中处理这个问题?

提前致谢

【问题讨论】:

  • Using Linq not equals的可能重复
  • @nawfal 不是重复的,这个问题是关于在同一个查询中同时使用相等和不相等的。

标签: linq entity-framework


【解决方案1】:

可以实现不相等的连接,

var result =  from Or in context.orders
          join Usr in context.vw_AllUsers on 
          new { userid = Or.UserId, IsNotAnAdmin = true}
          equals
          new { userid = Usr.UserId, IsNotAnAdmin = (Usr.RoleName != "Admin") }
          select ........

上述 linq 的 sql 等效项将在连接条件中有一个 case 语句。

【讨论】:

  • 多么杂乱无章,但是,喜欢创意。似乎 EF 应该内置这样简单的东西。
【解决方案2】:

LINQ 仅支持相等连接,无法在 join 本身中使用不同的运算符。

正如您所指出的,您可以使用 where 语句来获得相同的效果。如果您没有要加入的相等比较,则可以使用多个 from 子句。

From MSDN:

equals 运算符


join 子句执行等值连接。换句话说,您只能基于两个键的相等性进行匹配。不支持其他类型的比较,例如“大于”或“不等于”。为了明确所有连接都是等连接,join 子句使用 equals 关键字而不是 == 运算符。 equals 关键字只能在 join 子句中使用,它与 == 运算符在一个重要方面不同。使用equals,左键消耗外部源序列,而右键消耗内部源。外源仅在equals左侧范围内,内源序列仅在右侧范围内。

非等值连接


您可以通过使用多个from 子句将新序列独立地引入查询中来执行非等连接、交叉连接和其他自定义连接操作。如需更多信息,请参阅How to: Perform Custom Join Operations (C# Programming Guide)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    相关资源
    最近更新 更多