Я обнаружил некоторое поведение EF и ищу объяснение.
У меня есть следующий класс:
public class Position1
{
[Key]
public int UID { get; set; }
public int PID { get; set; }
public int KID { get; set; }
public double Content { get; set; }
}
Если я сделаю запрос:
Дело A (работает нормально)
var alist = db.Positions1.ToList();
это SQL генерируется:
SELECT
[Extent1].[UID] AS [UID],
[Extent1].[PID] AS [PID],
[Extent1].[KID] AS [KID],
[Extent1].[Content] AS [Content]
FROM [dbo].[Position1] AS [Extent1]
Если я это сделаю
Дело B (работает нормально)
var blist = db.Positions1.Where(x => x.UID == 1)
.Concat(db.Positions1.Where(x => x.UID == 2)).ToList();
результат будет
SELECT
[UnionAll1].[UID] AS [C1],
[UnionAll1].[PID] AS [C2],
[UnionAll1].[KID] AS [C3],
[UnionAll1].[Content] AS [C4]
FROM
(SELECT
[Extent1].[UID] AS [UID],
[Extent1].[PID] AS [PID],
[Extent1].[KID] AS [KID],
[Extent1].[Content] AS [Content]
FROM
[dbo].[Position1] AS [Extent1]
WHERE
1 = [Extent1].[UID]
UNION ALL
SELECT
[Extent2].[UID] AS [UID],
[Extent2].[PID] AS [PID],
[Extent2].[KID] AS [KID],
[Extent2].[Content] AS [Content]
FROM
[dbo].[Position1] AS [Extent2]
WHERE
2 = [Extent2].[UID]) AS [UnionAll1]
Если мы просто используем другой тип:
Дело C (работает нормально)
var clist = db.Positions1.Select(x => new { x.UID, x.PID, x.KID, x.Content }).ToList();
мы получаем это
SELECT
[Extent1].[UID] AS [UID],
[Extent1].[PID] AS [PID],
[Extent1].[KID] AS [KID],
[Extent1].[Content] AS [Content]
FROM
[dbo].[Position1] AS [Extent1]
То же, что и выше, как и ожидалось,
Но теперь, если мы сделаем это:
Дело D
var dlist = db.Positions1.Where(x => x.UID == 1).Select(x => new { x.UID, x.PID, x.KID, x.Content })
.Concat(db.Positions1.Where(x => x.UID == 2).Select(x => new { x.UID, x.PID, x.KID, x.Content }))
.ToList();
Мы получили это.
SELECT
[UnionAll1].[UID] AS [C1],
[UnionAll1].[UID1] AS [C2],
[UnionAll1].[PID] AS [C3],
[UnionAll1].[KID] AS [C4],
[UnionAll1].[Content] AS [C5]
FROM (SELECT
[Extent1].[UID] AS [UID],
[Extent1].[UID] AS [UID1],
[Extent1].[PID] AS [PID],
[Extent1].[KID] AS [KID],
[Extent1].[Content] AS [Content]
FROM [dbo].[Position1] AS [Extent1]
WHERE 1 = [Extent1].[UID]
UNION ALL
SELECT
[Extent2].[UID] AS [UID],
[Extent2].[UID] AS [UID1],
[Extent2].[PID] AS [PID],
[Extent2].[KID] AS [KID],
[Extent2].[Content] AS [Content]
FROM [dbo].[Position1] AS [Extent2]
WHERE 2 = [Extent2].[UID]) AS [UnionAll1]
Почему добавлен дополнительный столбец? Просто явно удваивает первый столбец.
Это SQL Провайдер сервера.
И сами запросы бесполезны, они просто созданы для демонстрации здесь.