在linq联接中使用equal和not equal
我正在尝试将以下SQL查询转换为linq在linq联接中使用equal和not equal,linq,entity-framework,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' 或者我可以在linq的何处处理它,以获得相同的结果,如下所示 where !Usr.RoleName.Equals("Admin") 但有可能在linq的join
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'
或者我可以在linq的何处处理它,以获得相同的结果,如下所示
where !Usr.RoleName.Equals("Admin")
但有可能在linq的join部分处理这个问题吗
提前感谢LINQ只支持相等联接,在
联接
本身中没有使用其他运算符的方法
正如您所指出的,您可以使用where
语句来实现相同的效果。如果您没有要加入的相等比较,则可以使用多个from
子句
:
等于
运算符
join
子句执行等联接。换句话说,只能根据两个键的相等性进行匹配。不支持其他类型的比较,例如“大于”或“不等于”。为了明确所有联接都是等分联接,join
子句使用equals
关键字而不是==运算符。equals
关键字只能在join
子句中使用,它在一个重要方面与==运算符不同。如果等于
,左键使用外部源序列,右键使用内部源序列。外部源仅在equals
左侧的范围内,而内部源序列仅在右侧的范围内
非等距连接
通过使用多个
from
子句将新序列独立地引入到查询中,可以执行非等联接、交叉联接和其他自定义联接操作。有关更多信息,请参阅。可以实现如下不相等的连接:
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语句。可能重复的@nawfal不是重复的,这个问题是关于在同一个查询中同时使用equal和not equal。这真是一个难题,但是,我喜欢这种创造性。似乎EF应该内置这样简单的东西。
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 ........