LINQ to SQL сгруппировать в пустую строку данных? - PullRequest
0 голосов
/ 10 октября 2018

У меня есть следующий код в sql:

SELECT "Field 1" AS fullname, null  AS limsuser_id
   UNION 
SELECT fullname, limsuser_id from table1
   UNION
SELECT "Field 2" AS fullname, null  AS limsuser_id
   UNION 
SELECT fullname, limsuser_id from table2

По сути, «Поле 1» и «Поле 2» действует как заголовок.
Теперь это возвращает набор данных на стороне ASP.net,

Однако, когда кто-то нажимает «Полное имя» при сортировке набора данных, данные сортируются также по «Поле 1» и «Поле 2».

Перед сортировкой:

Field 1
Jason Z   | 25
Anthony P | 21

Field 2
Shane | 24
Damon | 23

После сортировки:

Anthony P | 21
Damon     | 23
Field 1
Field 2
Jason Z   | 25
Shane     | 24

Ожидаемый результат:

Field 1
Anthony P | 21
Jason Z   | 25
Field 2
Damon | 23
Shane | 24

Как я могу создать группу по набору данных с «Полем 1» и «Полем 2» с помощью linq?Это упрощенный sql.У меня нет свободы изменять SQL-запрос.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Новый метод, предложенный @Ashkan, будет работать.Но для вашего требования вам может не понадобиться группировка.Просто добавьте столбец, чтобы определить порядок с различными значениями для каждого из 4 наборов

SELECT "Field 1" AS fullname, null  AS limsuser_id, 1 AS order_no
   UNION 
SELECT fullname, limsuser_id, 2 AS order_no from table1 
   UNION
SELECT "Field 2" AS fullname, null  AS limsuser_id, 3 AS order_no
   UNION 
SELECT fullname, limsuser_id, 4 AS order_no from table2

Затем выполните заказ в Linq

var orderedSet = items.OrderBy(x=> x.order_no).ThenBy(x=> x.fullname);
0 голосов
/ 10 октября 2018

У вас должно быть поле, которое показывает, из какой таблицы вы их взяли:

SELECT "Field 1" AS fullname, null  AS limsuser_id, 1 as [order]
   UNION 
SELECT fullname, limsuser_id, 1 as [order] from table1 
   UNION
SELECT "Field 2" AS fullname, null  AS limsuser_id, 2 as [order]
   UNION 
SELECT fullname, limsuser_id, 2 as [order] from table2

Тогда вы можете просто сделать это:

var result = yourItems.OrderByDescending(x=> x.fullname == "Field 1" || x.fullname == "Field 2")
    .ThenBy(x=> x.fullname)
    .GroupBy(x=> x.order);

.OrderByDescending(x=> x.fullname == "Field 1" || x.fullname == "Field 2") гарантирует, что Field 1 и Field 2 будут стоять на вершине своих групп независимо от их алфавитного порядка.

.ThenBy(x=> x.fullname) затем отсортирует его по fullname

, тогда вы можете GroupBy на order field.

Или, если у вас нулевой идентификатор только для Field 1 и Field 2, вы можете сделать это:

var result = yourItems.OrderByDescending(x=> x.limsuser_id  == null)
    .ThenBy(x=> x.fullname)
    .GroupBy(x=> x.order);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...