2

こんにちは、LINQ(VB.net 10)に変換する必要がある以下のクエリがあり、グループ化を正しく行うのに苦労しています。

LINQクエリをどのように呼んで子にaaawhere句を設定し(tblApplicationAccess)、結果を親テーブル(tblBusinessUnit)にグループ化しますか?

TSQL

SELECT tblBusinessUnit.ID, tblBusinessUnit.Name 
    FROM tblBusinessUnit INNER JOIN tblApplicationAccess ON 
        tblBusinessUnit.ID = tblApplicationAccess.BUID 
    WHERE(tblApplicationAccess.ApplicationID = @AppID) 
    GROUP BY tblBusinessUnit.ID, tblBusinessUnit.Name ORDER BY [Name]

エンティティモデル

ここに画像の説明を入力してください

アップデート

OK、動作しましたが、これがこれを行うための最良の方法であるかどうかはわかりません。明示的な結合を作成する必要がありますか?これは効率的ですか?

Dim var = (From bu In hf.BusinessUnits
            Join app In hf.ApplicationAccesses On bu.ID Equals app.BUID
            Where app.ApplicationID.Equals(56)
            Group By bu.ID, bu.Name, bu.IsInternalSupplier Into Group
                Select New BusinessUnitModel With {.ID = ID,
                    .Name = Name,
                    .IsInternalSupplier = IsInternalSupplier}).ToList
4

1 に答える 1

0

ApplicationAccess側から開始し、BussinessUnitナビゲーションプロパティを使用してBussinessUnitエンティティにアクセスする場合は、LinqtoEntitiesクエリの結合を省略できます。また、投影はフラットではなく階層的になります。これがより効率的になるとは言われていません。いくつかのプロファイリングを行い、私たちに知らせてください!

Using context = New QuerySpikesdfEntities

   'Create the query using LINQ to Entities. No join is necessary as we use the Navigation property 'BussinessUnit'
    Dim projections = From entry In context.ApplicationAccessEntries
                      Where entry.ApplicationID = 56
                      Group By supplierKey = entry.BussinessUnit.IsInternalSupplier Into supplierGroup = Group
                      Select New With {
                         .IsInternalSupplier = supplierKey,
                         .Suppliers = From supplier In supplierGroup
                                      Order By supplier.BussinessUnit.Name
                                      Select New With
                                         {
                                           .ID = supplier.BussinessUnit.ID,
                                           .Name = supplier.BussinessUnit.Name
                                         }
                             }

  'It remains to be seen if the resulting query is more efficient than the one that used the Join
  'This will output the query to the Console.
  'Profile this query and the Join query using the Stopwatch class.
   Console.WriteLine(DirectCast(projections, ObjectQuery).ToTraceString)

   Console.ReadLine()

   Console.WriteLine("All Bussiness units that have had access through application with id: {0}", 56)
   For Each projection In projections
      Console.WriteLine("   Internal suppliers: {0}", projection.IsInternalSupplier)
      For Each supplier In projection.Suppliers
         Console.WriteLine("      ID: {0}, Name: {1}", supplier.ID, supplier.Name)
      Next
    Next

 End Using
于 2012-09-13T19:09:30.767 に答える