#entity-framework #table-per-type
#entity-framework #таблица для каждого типа
Вопрос:
У меня есть таблица для иерархии типов.
Есть таблица с «Обновлениями» и есть «Werte», которые напрямую связаны с этими обновлениями. «Werte» (значения) могут иметь разные производные, такие как data_bool или data_Int, поэтому для этих «значений» существует несколько таблиц, вот диаграмма:
Когда я сейчас делаю что-то вроде этого:
IQueryable<Wert> alleWerte = (from w in db.Werte
where w.UpdateID == 5
select w);
alleWerte.ToList();
Когда это выполняется, это запрос, который является результатом этого:
SELECT
`UnionAll5`.`C1`,
CASE WHEN (`UnionAll5`.`C8` = 1) THEN (@gp1) WHEN (`UnionAll5`.`C9` = 1) THEN (@gp2) WHEN (`UnionAll5`.`C10` = 1) THEN (@gp3) WHEN (`UnionAll5`.`C11` = 1) THEN (@gp4) WHEN (`UnionAll5`.`C12` = 1) THEN (@gp5) ELSE (@gp6) END AS `C2`,
`Extent7`.`UpdateID`,
CASE WHEN (`UnionAll5`.`C8` = 1) THEN (`UnionAll5`.`C2`) WHEN (`UnionAll5`.`C9` = 1) THEN (NULL) WHEN (`UnionAll5`.`C10` = 1) THEN (NULL) WHEN (`UnionAll5`.`C11` = 1) THEN (NULL) WHEN (`UnionAll5`.`C12` = 1) THEN (NULL) END AS `C3`,
CASE WHEN (`UnionAll5`.`C8` = 1) THEN (NULL) WHEN (`UnionAll5`.`C9` = 1) THEN (`UnionAll5`.`C3`) WHEN (`UnionAll5`.`C10` = 1) THEN (NULL) WHEN (`UnionAll5`.`C11` = 1) THEN (NULL) WHEN (`UnionAll5`.`C12` = 1) THEN (NULL) END AS `C4`,
CASE WHEN (`UnionAll5`.`C8` = 1) THEN (NULL) WHEN (`UnionAll5`.`C9` = 1) THEN (NULL) WHEN (`UnionAll5`.`C10` = 1) THEN (`UnionAll5`.`C4`) WHEN (`UnionAll5`.`C11` = 1) THEN (NULL) WHEN (`UnionAll5`.`C12` = 1) THEN (NULL) END AS `C5`,
CASE WHEN (`UnionAll5`.`C8` = 1) THEN (NULL) WHEN (`UnionAll5`.`C9` = 1) THEN (NULL) WHEN (`UnionAll5`.`C10` = 1) THEN (NULL) WHEN (`UnionAll5`.`C11` = 1) THEN (`UnionAll5`.`C5`) WHEN (`UnionAll5`.`C12` = 1) THEN (NULL) END AS `C6`,
CASE WHEN (`UnionAll5`.`C8` = 1) THEN (NULL) WHEN (`UnionAll5`.`C9` = 1) THEN (NULL) WHEN (`UnionAll5`.`C10` = 1) THEN (NULL) WHEN (`UnionAll5`.`C11` = 1) THEN (NULL) WHEN (`UnionAll5`.`C12` = 1) THEN (`UnionAll5`.`C6`) END AS `C7`,
CASE WHEN (`UnionAll5`.`C8` = 1) THEN (NULL) WHEN (`UnionAll5`.`C9` = 1) THEN (NULL) WHEN (`UnionAll5`.`C10` = 1) THEN (NULL) WHEN (`UnionAll5`.`C11` = 1) THEN (NULL) WHEN (`UnionAll5`.`C12` = 1) THEN (NULL) ELSE (`UnionAll5`.`C7`) END AS `C8`,
`Extent7`.`WertArt_Id`
FROM ((SELECT
`UnionAll4`.`C1`,
`UnionAll4`.`C2`,
`UnionAll4`.`C3`,
`UnionAll4`.`C4`,
`UnionAll4`.`C5`,
`UnionAll4`.`C6`,
`UnionAll4`.`C7`,
`UnionAll4`.`C8`,
`UnionAll4`.`C9`,
`UnionAll4`.`C10`,
`UnionAll4`.`C11`,
`UnionAll4`.`C12`
FROM ((SELECT
`UnionAll3`.`C1`,
`UnionAll3`.`C2`,
`UnionAll3`.`C3`,
`UnionAll3`.`C4`,
`UnionAll3`.`C5`,
`UnionAll3`.`C6`,
`UnionAll3`.`C7`,
`UnionAll3`.`C8`,
`UnionAll3`.`C9`,
`UnionAll3`.`C10`,
`UnionAll3`.`C11`,
`UnionAll3`.`C12`
FROM ((SELECT
`UnionAll2`.`C1`,
`UnionAll2`.`C2`,
`UnionAll2`.`C3`,
`UnionAll2`.`C4`,
`UnionAll2`.`C5`,
`UnionAll2`.`C6`,
`UnionAll2`.`C7`,
`UnionAll2`.`C8`,
`UnionAll2`.`C9`,
`UnionAll2`.`C10`,
`UnionAll2`.`C11`,
`UnionAll2`.`C12`
FROM ((SELECT
`UnionAll1`.`Id` AS `C1`,
`UnionAll1`.`Data` AS `C2`,
`UnionAll1`.`C1` AS `C3`,
`UnionAll1`.`C2` AS `C4`,
`UnionAll1`.`C3` AS `C5`,
`UnionAll1`.`C4` AS `C6`,
`UnionAll1`.`C5` AS `C7`,
`UnionAll1`.`C6` AS `C8`,
`UnionAll1`.`C7` AS `C9`,
`UnionAll1`.`C8` AS `C10`,
`UnionAll1`.`C9` AS `C11`,
`UnionAll1`.`C10` AS `C12`
FROM ((SELECT
`Extent1`.`Id`,
`Extent1`.`Data`,
NULL AS `C1`,
NULL AS `C2`,
NULL AS `C3`,
NULL AS `C4`,
NULL AS `C5`,
1 AS `C6`,
0 AS `C7`,
0 AS `C8`,
0 AS `C9`,
0 AS `C10`
FROM `Data_Bools` AS `Extent1`) UNION ALL (SELECT
`Extent2`.`Id`,
NULL AS `C1`,
NULL AS `C2`,
NULL AS `C3`,
NULL AS `C4`,
NULL AS `C5`,
`Extent2`.`Data`,
0 AS `C6`,
0 AS `C7`,
0 AS `C8`,
0 AS `C9`,
0 AS `C10`
FROM `Data_Strings` AS `Extent2`)) AS `UnionAll1`) UNION ALL (SELECT
`Extent3`.`Id`,
NULL AS `C1`,
`Extent3`.`Data`,
NULL AS `C2`,
NULL AS `C3`,
NULL AS `C4`,
NULL AS `C5`,
0 AS `C6`,
1 AS `C7`,
0 AS `C8`,
0 AS `C9`,
0 AS `C10`
FROM `Data_ByteArrays` AS `Extent3`)) AS `UnionAll2`) UNION ALL (SELECT
`Extent4`.`Id`,
NULL AS `C1`,
NULL AS `C2`,
`Extent4`.`Data`,
NULL AS `C3`,
NULL AS `C4`,
NULL AS `C5`,
0 AS `C6`,
0 AS `C7`,
1 AS `C8`,
0 AS `C9`,
0 AS `C10`
FROM `Data_DateTimes` AS `Extent4`)) AS `UnionAll3`) UNION ALL (SELECT
`Extent5`.`Id`,
NULL AS `C1`,
NULL AS `C2`,
NULL AS `C3`,
`Extent5`.`Data`,
NULL AS `C4`,
NULL AS `C5`,
0 AS `C6`,
0 AS `C7`,
0 AS `C8`,
1 AS `C9`,
0 AS `C10`
FROM `Data_Floats` AS `Extent5`)) AS `UnionAll4`) UNION ALL (SELECT
`Extent6`.`Id`,
NULL AS `C1`,
NULL AS `C2`,
NULL AS `C3`,
NULL AS `C4`,
`Extent6`.`Data`,
NULL AS `C5`,
0 AS `C6`,
0 AS `C7`,
0 AS `C8`,
0 AS `C9`,
1 AS `C10`
FROM `Data_Ints` AS `Extent6`)) AS `UnionAll5` INNER JOIN `Werte` AS `Extent7` ON `UnionAll5`.`C1` = `Extent7`.`Id`
WHERE `Extent7`.`UpdateID` = @p__linq__0
В чем я ошибся? 😀
Серьезно, кто-нибудь может это объяснить? Действительно ли шаблон таблицы для каждого типа в базах данных делает ЭТО?
Комментарии:
1. можете ли вы поставить
.ToArray()
в конце этого (например, после закрывающей скобки)? Я подозреваю, что это вызвано тем, что что-то происходит после этой строки2. Спасибо за идею, но это ничего не изменило. Я забыл добавить код, который фактически выполнил запрос. У меня было «. ToList()» там и попробовал это с «. Также toArray()». Добавил это.
3. Я добавил диаграмму, чтобы представить свою архитектуру. Приводит ли эта иерархия таблиц для каждого типа entity framework к таким запросам?