8

我正在尝试将以下 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'

我找不到在同一个连接中使用相等不相等的方法。如果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 的连接部分中处理这个问题吗?

提前致谢

4

2 回答 2

11

LINQ 仅支持相等连接,没有办法在其join自身中使用不同的运算符。

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

来自 MSDN

运营equals


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

非等值连接


from您可以通过使用多个子句将新序列独立地引入到查询中来执行非等值连接、交叉连接和其他自定义连接操作。有关更多信息,请参阅如何:执行自定义联接操作(C# 编程指南)

于 2012-05-17T19:44:14.747 回答
11

可以实现不相等的连接,例如,

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 语句。

于 2013-03-11T10:41:14.483 回答