Concat с Entity Framework добавляет дополнительные столбцы в случае, если мы запрашиваем не исходный тип объекта DbSet - PullRequest
0 голосов
/ 11 января 2020

Я обнаружил некоторое поведение 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 Провайдер сервера.

И сами запросы бесполезны, они просто созданы для демонстрации здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...