Вопрос по linq, unpivot, pivot, .net, linq-to-sql – Доступна ли функция Unpivot (не Pivot) в Linq to SQL? Как?

5

Я видел сообщения, которые приносили бы вам сводные результаты, но не сводили их. Нужно знать, есть ли какой-нибудь чистый способ достижения? Если бы не какой-нибудь обходной путь?

Выполните это, чтобы увидеть результаты отмены в Management Studio

<code>CREATE TABLE [dbo].[Payment](
    [PaymentId] [int] NOT NULL,
    [EmployeeId] [int] NOT NULL,
    [RegularHours] [decimal](18, 0) NULL,
    [OvertimeHOurs] [decimal](18, 0) NULL
) ON [PRIMARY]

go

insert into payment values (1, 1, 40,  10)
insert into payment values (1, 2, 20,  0)

go

select * from payment 

select * from payment unpivot ([hours] for [paytype] in ([RegularHours], [OvertimeHOurs]))a
</code>

Выход для первого оператора Select

<code>PaymentId   EmployeeId  RegularHours                            OvertimeHOurs
----------- ----------- --------------------------------------- 
1           1           40                                      10
1           2           20                                      0

(2 row(s) affected)
</code>

Выход для второго оператора Select & amp; это то, что я ищу

<code>PaymentId   EmployeeId  hours                                   paytype
----------- ----------- ----------------------------------------------------- 
1           1           40                                      RegularHours
1           1           10                                      OvertimeHOurs
1           2           20                                      RegularHours
1           2           0                                       OvertimeHOurs

(4 row(s) affected)
</code>
Оператор ищет, как UNPIVOT TheRealTy
Извините, я не понимаю, что именно должно быть на выходе. Должны ли все часы всех выплат каждого сотрудника суммироваться? Подобно:{1 => {RegularHours => 60; OvertimeHours => 10}}? Michael Schnerring
Коммент добавлен только для того, чтобы показать, как сводить результаты в L2S, я заинтересован в получении UNPIVOT результаты тоже в L2S. Описание вопроса показывает, как этого добиться в T-SQ Pravin Pawar
ссылка, чтобы показать сводные результатыВо Pravin Pawar
lol, извини, даже не понял, что это был твой собственный комментарий. Думал, что кто-то совершенно неправильно прочитал вашу тему. TheRealTy

Ваш Ответ

2   ответа
6

я не вижу, как вы можете сделать это там, где он переведен на SQL, ниже приведено то, что я придумал, но это все выполненный управляемый код.

Или ... вы можете просто создать представление в SQL.

var payments = Payments.Select (p => new {
                            OvertimeHOurs = new {
                                    p.PaymentId,
                                    p.EmployeeId,
                                    Hours = p.OvertimeHOurs,
                                    PayType = "OvertimeHOurs"
                                    },
                            RegularHours = new {
                                    p.PaymentId,
                                    p.EmployeeId,
                                    Hours = p.RegularHours,
                                    PayType = "RegularHours"
                                    }
                            }
                );
var result = payments.Select(a => a.OvertimeHOurs).Union(payments.Select (p => p.RegularHours));
result.Dump(); // LINQPad Method

SQL генерируется это

-- Region Parameters
DECLARE @p0 NVarChar(1000) = 'OvertimeHOurs'
DECLARE @p1 NVarChar(1000) = 'RegularHours'
-- EndRegion
SELECT [t4].[PaymentId], [t4].[EmployeeId], [t4].[OvertimeHOurs] AS [Hours], [t4].[value] AS [PayType]
FROM (
    SELECT [t1].[PaymentId], [t1].[EmployeeId], [t1].[OvertimeHOurs], [t1].[value]
    FROM (
        SELECT [t0].[PaymentId], [t0].[EmployeeId], [t0].[OvertimeHOurs], @p0 AS [value]
        FROM [payment] AS [t0]
        ) AS [t1]
    UNION
    SELECT [t3].[PaymentId], [t3].[EmployeeId], [t3].[RegularHours], [t3].[value]
    FROM (
        SELECT [t2].[PaymentId], [t2].[EmployeeId], [t2].[RegularHours], @p1 AS [value]
        FROM [payment] AS [t2]
        ) AS [t3]
    ) AS [t4]
Не совсем, если бы вы добавили больше типов, вам также необходимо обновить вашу модель и, в свою очередь, обновить код. TheRealTy
Тогда я бы тоже подумал. Посмотрите здесь (для pivot), но он показывает, как динамически генерировать столбцы, также может быть перенесен в unpivot. Stackoverflow.com / вопросы / 10168566 / SQL-сервер с поворотными-функция TheRealTy
Upvote, Вау, это действительно то, что я ожидаю. Но как мы можем сделать это универсальным, если система ожидает, что различные типы оплаты будут добавлены динамически. Pravin Pawar
Определенно, даже для предложения UNPIVOT в T-SQL мне нужно добавить запись для Paytypes (если вообще я хочу сделать ее универсальной) ... пищу для размышлений - если мы сможем сделать ее универсальной для поддержки 500 Paytypes. :) Pravin Pawar
View тоже будет хорошим вариантом, не нужно перекомпилировать управляемый код Pravin Pawar
2
var result = new List<UnpivotedDbRecord>();
Payments.ForEach(r =>
                    {
                        result.Add(new UnpivotedDbRecord
                                        {
                                            EmployeeId = r.EmployeeId,
                                            PaymentId = r.PaymentId,
                                            PaymentType = "Regular",
                                            Hours = r.RegularHours
                                        });
                        result.Add(new UnpivotedDbRecord
                                        {
                                            EmployeeId = r.EmployeeId,
                                            PaymentId = r.PaymentId,
                                            PaymentType = "Overtime",
                                            Hours = r.OvertimeHours
                                        });
                    });
+ 1 мы можем сделать его общим? Pravin Pawar
Ну, как будет выглядеть полученная запись? Макет таблицы в вашем вопросе еще не динамический, потому что у вас есть обычный столбец и столбец сверхурочных. Или лучше: что именно вы имеете в виду под «универсальным»? Michael Schnerring
System.Data.Linq.Table<T> не содержит методForEach() тебе нужно позвонитьToList() первый, который генерирует неэффективный оператор SQL, такой какSELECT [t0].[PaymentId], [t0].[EmployeeId], [t0].[RegularHours], [t0].[OvertimeHOurs] FROM [payment] AS [t0] TheRealTy
Спасибо за это. Приятно знать. :) Michael Schnerring
С Generic я имею в виду поддержку нескольких (500) типов оплаты Pravin Pawar

Похожие вопросы