【问题标题】:Converting TSQL to Linq将 SQL 转换为 Linq
【发布时间】:2012-09-13 08:37:36
【问题描述】:

您好,我需要将以下查询转换为 LINQ(VB.net 10),我正在努力正确分组。

您如何将 LINQ 查询称为在子表 (tblApplicationAccess) 上有一个 where 子句并将结果分组到父表 (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]

实体模型

更新

好的,我已经开始工作了,但我不知道这是否是最好的方法。我需要创建显式连接吗?这效率高吗?

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

【问题讨论】:

  • 在我看来,分组根本没有必要,您只是希望结果按名称排序,不是吗?
  • 我想我需要对结果进行分组,因为我想要业务单位表中的不同项目。我当然需要在 TSQL 中这样做

标签: .net vb.net linq entity-framework


【解决方案1】:

当您从 ApplicationAccess 端开始时,您可以省略 Linq to Entities 查询中的联接,并使用 BussinessUnit Navigation 属性来访问 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2012-08-20
    相关资源
    最近更新 更多