К сожалению, в MSSQL (да и в T-SQL) нет агрегатной функции, которая бы объединяла значения из запроса в одну строку (как string.Join).
Нашел обсуждение с обходными путями:
http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string
Подскажите, можно ли реализовать как-то свою функцию, реализующую данный функционал, чтобы можно было ей пользоваться через LINQ-синтаксис. Если можно, то как?
Здравствуйте, <Аноним>, Вы писали:
А>К сожалению, в 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>>
Здравствуйте, 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] лично я не могу понять, куда тут можно этот атрибут прикрутить.
Здравствуйте, 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>>
Поторопился с ответом.
Группировку-то похоже не сделать с таким подходом*
... << RSDN@Home 1.2.0 alpha 5-AN-R6 rev. 7918>>
Здравствуйте, 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>>