【问题标题】:Entity Framework Core postgresql Array Type Mapping not working实体框架核心 postgresql 数组类型映射不起作用
【发布时间】:2021-01-10 16:45:51
【问题描述】:

我有一个奇怪的问题,也许是我遗漏了一些东西,但我有以下 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();

根据this的文章,应该是这样翻译的:

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

但不知何故,翻译后的查询是这样的:

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

区别在于应该是d.id = ANY(s.control_area)它是TRUE = FALSE

谁能告诉我我做错了什么?

提前致谢,

朱利安·迪米特洛夫

【问题讨论】:

  • 生成这样的 SQL 似乎是库内部的一个问题,我很想在 Github repo 上打开一个问题。
  • 嗨大卫,我已经在那里创建了一个问题 :) 感谢您的建议
  • 在这种情况下,您的问题会得到好评:)

标签: c# postgresql entity-framework-core npgsql


【解决方案1】:

我能够解决我的问题。它在this 问题中。

基本上:

它在实体配置中。 Device 实体中的 ControlArea 属性的类型为 List<long>。当我将其更改为 long[](长数组)时,它起作用了!

【讨论】:

  • 请注意,提供者的 5.0 版(已经在 rc1 中)对 List 有更好的支持,所以它应该不再重要了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多