EntityFrameworkコアpostgresql配列型マッピングが機能しない

Sep 24 2020

奇妙な問題があります。おそらくそれは私が見逃しているものですが、次のLINQLambdaクエリがあります。

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();

この記事によると、これはこれに翻訳されるべきです:

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

誰かが私が間違っていることを教えてもらえますか?

前もって感謝します、

ジュリアン・ディミトロフ

回答

Julian Sep 25 2020 at 08:36

私は自分の問題を解決することができました。それはであるこの問題。

基本的に:

それはエンティティ構成にありました。エンティティのControlAreaプロパティDeviceはタイプList<long>でした。long[](長い配列)に変更するとうまくいきました!