Entity Framework Core postgresql Array Type Mapping no funciona

Sep 24 2020

Tengo un problema extraño, tal vez es algo que me estoy perdiendo, pero tengo la siguiente consulta LINQ Lambda:

var ss = ctx.ShipZones.SelectMany(
                z => ctx.ShipDecks,
                (z, d) =>
                    new
                    {
                        Zone = z.ZIndex,
                        Deck = d.DIndex,
                        Value = ctx.Tags
                            .AsExpandable()
                            .Include(s => s.TagSettings.Device.System)
                            .Where(s =>
                                 s.TagSettings.TagTypeId == 171
                                 && s.TagSettings.Device.System.Id == z.Id
                                 && s.TagSettings.Device.ControlArea.Contains(d.Id)

                                    )
                            .Average(s => s.Value)

                    }
                ).ToList();

Según este artículo, esto debería traducirse a esto:

SELECT z.z_index AS "Zone", d.d_index AS "Deck", (
  SELECT AVG(t.value)
  FROM tags_current_data AS t
  INNER JOIN tags_settings AS t0 ON t.tag_id = t0.id
  INNER JOIN systems_devices AS s ON t0.device_id = s.id
  INNER JOIN systems AS s0 ON s.system_id = s0.id
  WHERE ((t0.tag_type_id = 171) AND (s0.id = z.id)) AND (d.id = ANY(s.control_area))) AS "Value"
FROM zones AS z
CROSS JOIN decks AS d

Pero de alguna manera, la consulta traducida es así:

SELECT z.z_index AS "Zone", d.d_index AS "Deck", (
  SELECT AVG(t.value)
  FROM tags_current_data AS t
  INNER JOIN tags_settings AS t0 ON t.tag_id = t0.id
  INNER JOIN systems_devices AS s ON t0.device_id = s.id
  INNER JOIN systems AS s0 ON s.system_id = s0.id
  WHERE ((t0.tag_type_id = 171) AND (s0.id = z.id)) AND (TRUE = FALSE)) AS "Value"
FROM zones AS z
CROSS JOIN decks AS d

La diferencia es donde tiene que estar d.id = ANY(s.control_area), esTRUE = FALSE

¿Alguien puede decirme qué estoy haciendo mal?

Gracias por adelantado,

Julian Dimitrov

Respuestas

Julian Sep 25 2020 at 08:36

Pude resolver mi problema. Está en este número.

Básicamente:

Estaba en la configuración de entidades. La ControlAreapropiedad en la Deviceentidad era de tipo List<long>. Cuando lo cambié a long[](matriz larga) ¡funcionó!