[linq] Как склеить результат вложенного запроса в строку?
От: Аноним  
Дата: 20.08.11 06:22
Оценка:
К сожалению, в MSSQL (да и в T-SQL) нет агрегатной функции, которая бы объединяла значения из запроса в одну строку (как string.Join).
Нашел обсуждение с обходными путями: http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string
Подскажите, можно ли реализовать как-то свою функцию, реализующую данный функционал, чтобы можно было ей пользоваться через LINQ-синтаксис. Если можно, то как?
Re: [linq] Как склеить результат вложенного запроса в строку
От: Mace Windu  
Дата: 22.08.11 06:02
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>К сожалению, в MSSQL (да и в T-SQL) нет агрегатной функции, которая бы объединяла значения из запроса в одну строку (как string.Join).

А>Нашел обсуждение с обходными путями: http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string
А>Подскажите, можно ли реализовать как-то свою функцию, реализующую данный функционал, чтобы можно было ей пользоваться через LINQ-синтаксис. Если можно, то как?

Если надо именно функцию, то пишешь managed aggregate. пример как раз с нужной функцией.
Но это будет примерно в 2 раза медленнее чем решение через FOR XML.*
... << RSDN@Home 1.2.0 alpha 5-AN-R6 rev. 7918>>
Re[2]: [linq] Как склеить результат вложенного запроса в стр
От: Jack128  
Дата: 22.08.11 06:07
Оценка:
Здравствуйте, Mace Windu, Вы писали:

MW>Здравствуйте, <Аноним>, Вы писали:


А>>К сожалению, в MSSQL (да и в T-SQL) нет агрегатной функции, которая бы объединяла значения из запроса в одну строку (как string.Join).

А>>Нашел обсуждение с обходными путями: http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string
А>>Подскажите, можно ли реализовать как-то свою функцию, реализующую данный функционал, чтобы можно было ей пользоваться через LINQ-синтаксис. Если можно, то как?

MW>Если надо именно функцию, то пишешь managed aggregate. пример как раз с нужной функцией.

MW>Но это будет примерно в 2 раза медленнее чем решение через FOR XML.*

а как потом эту функцию потом можно вызвать через linq ?? Вот тут http://rsdn.ru/forum/prj.rfd/4368512.1.aspx
Автор: IT
Дата: 04.08.11
IT сказал, что можно через [SqlFunction] лично я не могу понять, куда тут можно этот атрибут прикрутить.
Re[3]: [linq] Как склеить результат вложенного запроса в стр
От: Mace Windu  
Дата: 22.08.11 06:59
Оценка:
Здравствуйте, Jack128, Вы писали:

J>а как потом эту функцию потом можно вызвать через linq ?? Вот тут http://rsdn.ru/forum/prj.rfd/4368512.1.aspx
Автор: IT
Дата: 04.08.11
IT сказал, что можно через [SqlFunction] лично я не могу понять, куда тут можно этот атрибут прикрутить.


Вот попробовал — работает.
Функция
        public static class Sql
    {
        [SqlFunction("dbo.ManagedConcat", ServerSideOnly = true)]
        public static string Concat(string param)
        {
            return string.Empty;
        }
    }


Использование
var result = (from s in db.Sessions select Sql.Concat(s.SessionTicket)).First();

*
... << RSDN@Home 1.2.0 alpha 5-AN-R6 rev. 7918>>
Re[4]: [linq] Как склеить результат вложенного запроса в стр
От: Mace Windu  
Дата: 22.08.11 07:24
Оценка:
Поторопился с ответом.
Группировку-то похоже не сделать с таким подходом*
... << RSDN@Home 1.2.0 alpha 5-AN-R6 rev. 7918>>
Re[5]: [linq] Как склеить результат вложенного запроса в стр
От: Jack128  
Дата: 22.08.11 07:26
Оценка:
Здравствуйте, Mace Windu, Вы писали:

MW>Поторопился с ответом.

MW>Группировку-то похоже не сделать с таким подходом*

вот и я про то. Нужно чтоб Concat принимал IQueriable<string> в качестве параметра
Re[6]: [linq] Как склеить результат вложенного запроса в стр
От: Mace Windu  
Дата: 22.08.11 08:19
Оценка:
Здравствуйте, Jack128, Вы писали:

J>вот и я про то. Нужно чтоб Concat принимал IQueriable<string> в качестве параметра


Не поможет, тут нужна поддержка кастомных агрегатов в BLToolkit. Через какой-нибудь SqlAggregateAttribute. Но это надо IT дергать.

Я на коленке попытался bltoolkit доточить, получился такой SQL
SELECT 
    t1.t2.UserName as UserName, 
    t1.ManagedConcat(t2.SessionTicket) as c1 
FROM 
    Sessions as t2 
GROUP BY 
    t2.UserName

Запрос получился неправильный, но потенциал налицо

Декларация (содрал с Max)
[SqlFunction("dbo.ManagedConcat", ServerSideOnly = true)]
        public static TResult ManagedConcat<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
        { 
            return default(TResult);
        }
*
... << RSDN@Home 1.2.0 alpha 5-AN-R6 rev. 7918>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.