Как использовать LINQ (или TSQL) для группировки набора данных, но включить верхний элемент и количество - PullRequest
0 голосов
/ 30 сентября 2011

Я борюсь с тем, как подойти к этому. У меня есть ваш базовый набор данных, возвращенный запросом TSQL (SQL2005), где данные содержат список основных и подробных элементов. Довольно ванильно, у вас есть главная таблица, присоединенная к вашей таблице подробностей, так что вы можете получить несколько строк обратно на основную запись.

Что-то вроде:

ID / Item Descr / Subitem Descr
1 /  Jane Doe / shoes
1 /  Jane Doe / hats
2 /  John Smith / hats

То, что я хотел бы сделать, это "сгладить" это немного. Так что-то вроде:

ID / Item Descr / Count / Most Recent Subitem
1 / Jane Doe / 2 / shoes
2 / John Smith / 1 / hats

Любые предложения по SQL-запросу или, возможно, запрос LINQ, который я мог бы выполнить в наборе данных, который я получил от первоначального SQL-запроса ...?

Ответы [ 3 ]

0 голосов
/ 30 сентября 2011

Не совсем уверен, что вы подразумеваете под "top", но это начало, если вы хотите сделать это в SQL:

SELECT id, ItemDesc, COUNT(*), MAX(SubItemDesc)
FROM MyTable
GROUP BY id, ItemDesc
0 голосов
/ 30 сентября 2011

Я использовал коррелированный подзапрос, который всегда нервировал меня с точки зрения производительности. У меня нет цифр, подтверждающих это, и я не очень хорош в чтении планов выполнения, это просто внутреннее чувство.

Множество хороших примеров стекового потока, которые помогли мне пройти по этому пути (например: Расширенный SQL-запрос с подзапросами, функциями группировки, подсчета и суммирования в SQLalchemy и Вариант использования Предложение GROUP BY в TSQL )

Мне было интересно, помогло бы использование какой-либо из новых оконных функций (row_number () или rank ()), но я не очень далеко продвинулся по этой линии.

Я все еще думаю, что было бы лучше просто вернуть все строки основной детали, тогда лучше было бы "обработать" их с помощью LINQ. Наш SQL Server довольно быстро отбросит этот набор данных на веб-сервер, а затем «распределит» рабочую нагрузку, выполнив LINQ на веб-сервере, и, наконец, свяжет все это с моим видом сетки ASP.NET и отправит его клиенту. Много движущихся частей, но может быть интересно ...

0 голосов
/ 30 сентября 2011
var q = from i in Context.Items
        group i by i.ItemDescr into g
        select new 
        {
            ID = g.FirstOrDefault().ID,
            ItemDescr = g.Key,
            Count = g.Count(),
            MostRecentSubItem = g.FirstOrDefault().SubitemDescr // you don't show how to pick the "most recent"
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...