在linq连接中使用相等且不相等

时间:2012-05-17 19:39:41

标签: linq entity-framework

我正在尝试将以下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&lt;&gt; '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的连接部分处理这个吗?

提前致谢

2 个答案:

答案 0 :(得分:11)

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

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

From MSDN

  

equals运算符

     

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

     

非等值连接

     

您可以使用多个from子句将新序列独立地引入查询,从而执行非等同连接,交叉连接和其他自定义连接操作。有关详细信息,请参阅How to: Perform Custom Join Operations (C# Programming Guide)

答案 1 :(得分:8)

不等于加入可以像

那样实现
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语句。