2

Entity Framework 5 を使用した SQL データベースから取得した以下のテーブルがあります。

私がしたいのは、tblUserBusiness.BUID が渡された値と等しいか、Users.IsSysAdmin が True であるすべてのユーザーを選択することです。Users.IsSysAdmin が True の場合、関連する tblUserBusiness レコードがないため、左外部結合になります。

ここに画像の説明を入力

以下の LINQ クエリから始めましたが、正しくフィルター処理されましたが、外部結合は許可されませんでした

        businessUsers = (From u In db.Users
                            From bu In db.tblUserBusinesses
                            Where bu.BUID.Equals(buID) Or u.IsSysAdmin.Equals(True)
                                Select New Users With {.ID = u.ID,
                                                       .Name = u.Name,
                                                       .UserName = u.UserName}).ToList

次に、外部結合を可能にする以下のクエリに移動しましたが、実装方法がわかりませんWhere bu.BUID.Equals(buID) Or u.IsSysAdmin.Equals(True)

        businessUsers = (From u In db.Users
                            Group Join bu In db.tblUserBusinesses
                                On u Equals bu.User
                                Into userList = Group
                         Select New Users With {.ID = u.ID,
                                                       .Name = u.Name,
                                                       .UserName = u.UserName}).ToList

基本的に私が求めているのは、以下の TSQL に相当する LINQ です。

SELECT Users.ID, Users.UserName, Users.Name 
    FROM Users LEFT OUTER JOIN tblUserBusiness ON Users.ID = tblUserBusiness.UserID
    WHERE (Users.IsSysAdmin = 1) OR (tblUserBusiness.BUID = 5)
4

3 に答える 3

2

これを試して:

Dim buID As Integer = ... ' BUID to get

Dim q = From u In Users
        Group Join bu In tblUserBusiness On u.Id Equals bu.UserID Into Group
        From j In Group.DefaultIfEmpty
        Where u.IsSysAdmin OrElse If(j IsNot Nothing, j.BUID = buID, False)
        Select u

... また...

Dim q = From u In Users
        Group Join bu In tblUserBusiness On u.Id Equals bu.UserID Into Group
        From j In Group.Where(Function(x) x.BUID = buID).DefaultIfEmpty
        Where u.IsSysAdmin OrElse j IsNot Nothing
        Select u

どちらかがあなたに必要なものを与えてくれます。おもう :)

于 2013-06-13T19:00:27.460 に答える
0

DefaultIfEmptyを使用する必要があるため、次のようにする必要があります

Group Join bu In db.tblUserBusinesses.DefaultIfEmpty

以下は縮小されたテスト ケースです (新しいコンソール アプリケーションが必要です)。

Module Module1
  Class Person
    Public Property Id As String
    Public Property FirstName As String
  End Class

  Class Address
    Public Property Id As String
    Public Property StreetName As String
  End Class

  Sub Main()
    Dim personList As New List(Of Person)
    With personList
      .Add(New Person With {.Id = "1", .FirstName = "John"})
      .Add(New Person With {.Id = "2", .FirstName = "Peter"})
      .Add(New Person With {.Id = "3", .FirstName = "Victor"})
    End With

    Dim addressList As New List(Of Address)
    With addressList
      .Add(New Address With {.Id = "1", .StreetName = "Baker Street"})
      .Add(New Address With {.Id = "2", .StreetName = "Broadway"})
      .Add(New Address With {.Id = "4", .StreetName = "Hwy 999"})
    End With

    Dim v = From p In personList
            Group Join a In addressList.DefaultIfEmpty
            On a.Id Equals p.Id Into Group
            Select PersonId = p.Id,
                   PersonName = p.FirstName,
                   StreetName = Group.FirstOrDefault
  End Sub
End Module

これは Person-to-Address 関係の理想的な設計ではないかもしれませんが、 がandOuter Joinを使用して VB.NET で動作できることを証明しています (これはオプションであり、適切な方法でデータを整理するのに役立ちます)。DefaultIfEmptyFirstOrDefault

于 2013-06-13T14:53:37.627 に答える