LINQ中的自联接在应用于edmx实体数据模型时失败

问题描述 投票:0回答:1

我的EF模型中有下面两个表。

Table'Equipo':该表包含设备。主键是等号

Id | equipoId  |  Description
1     9474
2     9473
3     9475

表'CalibracionVerificacion':该表包含每个设备的校准数据。主键是ID。

Id | equipoId | magnitudId | fechaPrevista1 9474 0402 2020-05-01 00:00:00.0002 9474 0808 2020-01-01 00:00:00.0003 9474 0101 2019-12-19 00:00:00.0004 9473 2001 2018-02-08 00:00:00.0005 9473 1901 2019-05-23 00:00:00.0006 9473 1901 2017-08-17 00:00:00.0007 9472 0808 2020-11-11 00:00:00.0008 9472 0101 2019-01-01 00:00:00.000

我需要遍历表Equipo中的每个设备,并对每个设备执行以下步骤:

  1. 在设备数据校准中,按magnitudId分组,并为每个magnitudId获取最新的fechaPrevista。
  2. 一旦我想获取最早的fechaPrevista的每个magnitudId,都有最新的日期和时间(fechaPrevista)>
  3. 所以我在LINQ表达式下面执行:

LINQ表达式

Dim eq = db.Equipo
For Each equipo As Equipo In eq
   Dim fechaPrevista As DateTime? =
    (From c In equipo.CalibracionVerificacion
     Join c2 In (From c3 In equipo.CalibracionVerificacion
                 Where c3.equipoId = equipo.equipoId AndAlso Not (String.IsNullOrWhiteSpace(c3.magnitudId))
                 Group c3 By c3.magnitudId Into cgroup = Group
                 Select New With
                 {
                    Key .MagnitudID = magnitudId,
                    Key .MaxDate = cgroup.Max(Function(x) x.fechaPrevista)
                 }
                 ) On New With {.JoinProperty1 = c.magnitudId, .JoinProperty2 = c.fechaPrevista} Equals
                      New With {.JoinProperty1 = c2.MagnitudID, .JoinProperty2 = c2.MaxDate}
                 Where c.equipoId = equipo.equipoId
                 Select c).Min(Function(d) d.fechaPrevista))

    // Do something with fechaPrevista

Next

例如,考虑到上表,对于equipoId = 9474,我想获取最早的日期和时间,即2019-12-19 00:00:00.000,但由于fechaPrevista,我一无所获。假设在此示例中equipo.equipoId = 9474:

我一直在单独调试Linq查询,并得到以下内容(内部Linq表达式):

Dim c23 = From c3 In equipo.CalibracionVerificacion
          Where c3.equipoId = equipo.equipoId AndAlso Not (String.IsNullOrWhiteSpace(c3.magnitudId))
          Group c3 By c3.magnitudId Into cgroup = Group
          Select New With
          {
              Key .MagnitudID = magnitudId,
              Key .MaxDate = cgroup.Max(Function(x) x.fechaPrevista)
          }

此LINQ查询正在工作,并返回以下结果:

enter image description here

因此内部LINQ表达式运行正常。问题在于外部LINQ表达式,连接失败,然后返回Nothing作为结果。我不懂为什么。有什么想法吗?

基本上翻译成SQL Server的LINQ表达式是(例如,为简化起见,因为一个equipoId是:):

-- Region Parameters
DECLARE @p0 Int = 9474
DECLARE @p1 Int = 9474
-- EndRegion
SELECT MIN([t0].[fechaPrevista]) AS [value]
FROM [eq].[CalibracionVerificacion] AS [t0]
INNER JOIN (
    SELECT MAX([t1].[fechaPrevista]) AS [value], [t1].[magnitudId]
    FROM [eq].[CalibracionVerificacion] AS [t1]
    WHERE [t1].[equipoId] = @p0
    GROUP BY [t1].[magnitudId]
    ) AS [t2] ON ([t0].[magnitudId] = [t2].[magnitudId]) AND ([t0].[fechaPrevista] = [t2].[value])
WHERE [t0].[equipoId] = @p1

我的EF模型中有两个表格。表'Equipo':该表包含设备。主键是等号ID | equipoId |说明1 9474 2 9473 3 9475表'...

vb.net entity-framework linq edmx
1个回答
0
投票

[使用LINQ,声明式思考(即,根据所需结果)比命令式思考(即控制流)有所帮助。据我所知,最终您要遍历具有以下属性/字段的结果集:

© www.soinside.com 2019 - 2024. All rights reserved.