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'

同じ結合で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 部分で処理して同じ結果を得ることができます。

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

しかし、linq の join 部分でこれを処理することは可能ですか?

前もって感謝します

4

2 に答える 2

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 に答える
11

LINQ は等値結合のみをサポートしjoinます。それ自体で別の演算子を使用する方法はありません。

ご指摘のとおり、whereステートメントを使用して同じ効果を得ることができます。結合する等価比較がない場合は、複数のfrom句を使用できます。

MSDN から:

equalsオペレーター_


join句は等結合を実行します。つまり、2 つのキーが等しい場合にのみ一致を判断できます。「より大きい」または「等しくない」などの他のタイプの比較はサポートされていません。すべての結合が等結合であることを明確にするために、joinequalsでは == 演算子の代わりにキーワードを使用しています。equalsキーワードは句でのみ使用でき、join1 つの重要な点で == 演算子と異なります。ではequals、左のキーは外側のソース シーケンスを消費し、右のキーは内側のソース シーケンスを消費します。外側のソースは の左側でのみスコープ内にequalsあり、内側のソース シーケンスは右側でのみスコープ内にあります。

非等結合


from複数の句を使用して新しいシーケンスをクエリに個別に導入することにより、非等価結合、クロス結合、およびその他のカスタム結合操作を実行できます。詳細については、「方法: カスタム結合操作を実行する (C# プログラミング ガイド)」を参照してください。

于 2012-05-17T19:44:14.747 に答える