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 laDeviceentidad era de tipoList<long>. Cuando lo cambié along[](matriz larga) ¡funcionó!