2012-09-13 237 views
2

喜有以下查询,我需要转换为LINQ(VB.net 10),我挣扎着爬分组的权利。转换TSQL到LINQ

你怎么称之为LINQ查询有一个地方的孩子(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] 

实体模型

enter image description here

更新

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 
+0

你使用LINQ2SQL还是EF? –

+0

实体框架4 –

+0

在我看来,该组是没有必要的,你只是希望结果按名称排序,不是吗? – Dabblernl

回答

0

可以省略,当你开始在ApplicationAccess侧LINQ的联接到实体查询和使用BussinessUnit导航属性来获取到BussinessUnit实体。此外,投影将分层而不是平面。这并不是说这会更有效率。做一些分析并告诉我们!

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