Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / сложный JSON / 22 сообщений из 22, страница 1 из 1
26.10.2014, 15:45
    #38787612
RAVen42
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
МСУ Причем тут EF и хранимая процедура?
Надеялся что всю работу по построению JSON возьмет на себя APIController.
Я совсем недавно познакомился с ASP.NET так что очень много незнакомого и непонятного.

Спасибо за совет!
...
Рейтинг: 0 / 0
26.10.2014, 16:05
    #38787627
monstrU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
МСУ,

какое сообщение было первым? :)
...
Рейтинг: 0 / 0
26.10.2014, 16:13
    #38787630
RAVen42
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
Доброго всем дня!

Продолжаю разбираться с EF и WEB API.
Есть процедура на SQL сервере возвращает следующий набор данных

ID|name|hobbies1|hobbies2|hobbies3|address|
1 | Doe | reading | cinema | sports | ABC |

как вернуть вот такой JSON:

Код: xml
1.
2.
3.
4.
5.
6.
7.
{"ID":1,
"name":"Doe",
"hobbies":
   ["reading",
    "cinema",
    "sports"  ],
"address":"ABC"}



И вообще возможно так сделать из одного набора данных?
...
Рейтинг: 0 / 0
26.10.2014, 16:16
    #38787632
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
Сделай себе класс и оборачивай его json. Либо можно анонимным типом обойтись.

Код: c#
1.
2.
3.
4.
5.
6.
7.
public class RootObject
{
    public int ID { get; set; }
    public string name { get; set; }
    public string address { get; set; }
    public IEnumerable<string> hobbies { get; set; }
}



Причем тут EF и хранимая процедура?
...
Рейтинг: 0 / 0
26.10.2014, 16:24
    #38787638
RAVen42
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
monstrU , 16760595
МСУ , например берем класс RootObject из Вашего примера.
У меня есть 2 процедуры на сервере:
1) возвращает: ID, name, address
2) возвращает: ID, hobbies

Как сделать JOIN данных из этих 2-х процедур по ID, чтобы записать данные в класс RootObject
Или это вообще по другому делается?

Если не сложно можно простой пример?
...
Рейтинг: 0 / 0
26.10.2014, 16:40
    #38787640
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
RAVen42 monstrU , 16760595
МСУ , например берем класс RootObject из Вашего примера.
У меня есть 2 процедуры на сервере:
1) возвращает: ID, name, address
2) возвращает: ID, hobbies

Как сделать JOIN данных из этих 2-х процедур по ID, чтобы записать данные в класс RootObject
Или это вообще по другому делается?

Если не сложно можно простой пример?Простой пример - это сначала заполнить спискок List<RootObject> данными из первой процедуры, а потом в цикле, или при первом обращении к свойству hobbies (Lazy), заполнить последнее данными из второй процедуры.

Также RootObject может реализовывать так называемый шаблон Proxy, и при обращении к свойству hobbies, всегда дёргать хранимую процедуру.

Но всё это не имеет никакого отношения к JSON и Web API.
Конвертацию модели в JSON в Web API выполняет соответсвующий formatter, которму абсолютно по фигу, каким образом была заполнена модель, которую необходимо преобразовать в JSON.
...
Рейтинг: 0 / 0
26.10.2014, 16:47
    #38787641
RAVen42
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
skyANA, да я понимаю (уже) что всё это не имеет никакого отношения к JSON и Web API.
рассматриваемая мной ситуация происходит в контексте WEB API и JSON. и я понимаю что formatter'у абсолютно пофиг.
...
Рейтинг: 0 / 0
26.10.2014, 16:57
    #38787646
RAVen42
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
авторПростой пример - это сначала заполнить спискок List<RootObject> данными из первой процедуры, а потом в цикле, или при первом обращении к свойству hobbies (Lazy), заполнить последнее данными из второй процедуры.

Как то это не красиво и долго.
А если первая процедура вернет 10000 записей? эт чтож дергать 10000 раз 2-ую процедуру?
Циклы тоже как то не очень красиво.

Неужели нельзя сделать:
1) Выполнить процедуру №1
1) Выполнить процедуру №2

а потом что то вроде такого (очень сильно утрирую):
Код: c#
1.
 RootObject rootobject =  proc1.id join proc2.id


таким образом заполним rootobject данными из двух процедур
а дальше
Код: c#
1.
 return ...

и formatter rootobject красиво преобразует в JSON

я вот про что спрашиваю.
...
Рейтинг: 0 / 0
26.10.2014, 17:15
    #38787649
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
RAVen42, EF лишь формирует запрос на языке T-SQL за Вас и отправляет серверу на выполнение.
Напишите-ка то, что хотите в виде одного запроса (в виде одной хранимой процедуры).

По какому полю Вы собрались JOIN-ить результаты хранимых процедур?
...
Рейтинг: 0 / 0
26.10.2014, 17:17
    #38787650
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
Зачем вообще использовать хранимые процедуры? Нельзя-ли написать запрос, или представление (VIEW)?
...
Рейтинг: 0 / 0
26.10.2014, 17:26
    #38787652
RAVen42
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
авторПо какому полю Вы собрались JOIN-ить результаты хранимых процедур?
по полю ID
Могу написать и в виде одной процедуры, например в поле hobbies , будет строка с перечислением "reading,cinema,sports "

skyANAЗачем вообще использовать хранимые процедуры? Нельзя-ли написать запрос, или представление (VIEW)?
1) Преследую цель по максимуму логику сделать на сервере, чтоб не переделывать фронт-енд.
2) НА T-SQL значительно проще и удобней написать и поддерживать МЕГА запрос, нежели писать его в коде.
3) View не вариант, слишком много ограничений для моего случая( временные таблицы, функции и т.д....)

Весь вопрос как легко и красиво сделать из данных возвращаемых процедурой JSON сложной структуры.
...
Рейтинг: 0 / 0
26.10.2014, 18:05
    #38787660
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
RAVen42авторПо какому полю Вы собрались JOIN-ить результаты хранимых процедур?
по полю ID
Могу написать и в виде одной процедуры, например в поле hobbies , будет строка с перечислением "reading,cinema,sports "

skyANAЗачем вообще использовать хранимые процедуры? Нельзя-ли написать запрос, или представление (VIEW)?
1) Преследую цель по максимуму логику сделать на сервере, чтоб не переделывать фронт-енд.
2) НА T-SQL значительно проще и удобней написать и поддерживать МЕГА запрос, нежели писать его в коде.
3) View не вариант, слишком много ограничений для моего случая( временные таблицы, функции и т.д....)

Весь вопрос как легко и красиво сделать из данных возвращаемых процедурой JSON сложной структуры.Легко и красиво - это сформировать запрос с нужными JOIN-ами, выполнить его, а результат замапить в набор объектов, что formatter превратит в JSON.
Собственно, что и делает ORM.

Но в Вашем случае почему-то запрос составить нельзя. А в ORM нет чудесных механизмов для объединения двух хранимок в одну в одном запросе.

Пишите ещё одну хранимую процедуру, что будет вызывать первые две, объединять (JOIN) результаты по полю ID, и возвращать.
И используйте её: Data read using Stored Procedure .
...
Рейтинг: 0 / 0
26.10.2014, 18:10
    #38787662
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
P.S.: а от использования МЕГА запросов, временных таблиц и функции при выборке данных можно и избавиться.
...
Рейтинг: 0 / 0
27.10.2014, 02:40
    #38787786
Calabonga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
А если первая процедура вернет 10000 записей? эт чтож дергать 10000 раз 2-ую процедуру?
А еще некоторые используют пейджинг...:)
...
Рейтинг: 0 / 0
27.10.2014, 08:15
    #38787821
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
CalabongaА если первая процедура вернет 10000 записей? эт чтож дергать 10000 раз 2-ую процедуру?
А еще некоторые используют пейджинг...:)В контексте Web API, для выборки 10000 записей из базы, зачем он нужен?
Ну хочет потребитель получить все 10000 записей от вашего API, флаг ему вруки. Захочет ограничить выборку, сформирует другой запрос в формате OData.
...
Рейтинг: 0 / 0
27.10.2014, 13:36
    #38788152
RAVen42
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
skyANA Легко и красиво - это сформировать запрос с нужными JOIN-ами, выполнить его, а результат замапить в набор объектов, что formatter превратит в JSON.
Собственно, что и делает ORM.

Но в Вашем случае почему-то запрос составить нельзя. А в ORM нет чудесных механизмов для объединения двух хранимок в одну в одном запросе.

Пишите ещё одну хранимую процедуру, что будет вызывать первые две, объединять (JOIN) результаты по полю ID, и возвращать.
И используйте её:

Да дело вовсе не в одной или двух процедурах и не в количестве возвращаемых данных.
процедуру использую ТОЛЬКО из соображений:
1) Преследую цель по максимуму логику сделать на сервере, чтоб не переделывать фронт-енд.
2) НА T-SQL значительно проще и удобней написать и поддерживать МЕГА запрос, нежели писать его в коде.
3) View не вариант, слишком много ограничений для моего случая( временные таблицы, функции и т.д....)


skyANA P.S.: а от использования МЕГА запросов, временных таблиц и функции при выборке данных можно и избавиться.
Да можно но это очень неудобно.
Но когда при выборке используется куча функций, да при этом ещё и с десяток линкованых серверов со своими процедурами и таблицами и т.д.
Как Вы себе представляете писать этот запрос, состоящий из 1000+ строк в коде?
Зачем в коде разводить бардак? Когда можно просто очень коротко и ясно написать
Код: c#
1.
exec ProcedureBlaBlaBLa Param1,Param2



Допустим вернула у меня процедура такие данные:

ID|name| hobbies |address |
1 | Doe | reading,cinema,sports | ABC |

Что мне написать в коде чтоб результатом был JSON


{"ID":1,
"name":"Doe",
"hobbies":
["reading",
"cinema",
"sports" ],
"address":"ABC"}
...
Рейтинг: 0 / 0
27.10.2014, 14:03
    #38788183
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
RAVen42когда при выборке используется куча функций, да при этом ещё и с десяток линкованых серверов со своими процедурами и таблицами и т.д.
Как Вы себе представляете писать этот запрос, состоящий из 1000+ строк в коде?Очень просто: вызвать всю эту "куча функций, да при этом ещё и с десяток линкованых серверов со своими процедурами и таблицами" при добавлении данных,
а при выборке тупо вернуть готовый результат запросом вида: SELECT Column1, Column2, ..., ColumnN FROM Table.

Интересно, сколько по времени у Вас выполняется такая хранимая процедура? Что будет при нагрузке скажем в 20 запросов в секунду?
...
Рейтинг: 0 / 0
27.10.2014, 14:11
    #38788199
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
RAVen42Допустим вернула у меня процедура такие данные:

ID|name| hobbies |address |
1 | Doe | reading,cinema,sports | ABC |

Что мне написать в коде чтоб результатом был JSON


{"ID":1,
"name":"Doe",
"hobbies":
["reading",
"cinema",
"sports" ],
"address":"ABC"}
Хм, что-то вроде этого:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
using DomainModel;

public class PersonsController : ApiController
{
    // GET api/persons
    public IEnumerable<Person> Get()
    {
        return personRepository.FindAll();
    }
}


При этом в классе Startup прописать:
Код: c#
1.
2.
3.
4.
5.
var jsonFormatter = System.Web.Http.GlobalConfiguration.Configuration.Formatters.JsonFormatter;
var jsonFormatterSettings = jsonFormatter.SerializerSettings;

jsonFormatterSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
jsonFormatterSettings.Formatting = Formatting.Indented;
...
Рейтинг: 0 / 0
27.10.2014, 17:36
    #38788479
RAVen42
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
skyANA,
т.е. благодаря именно этому
Код: c#
1.
2.
3.
4.
5.
var jsonFormatter = System.Web.Http.GlobalConfiguration.Configuration.Formatters.JsonFormatter;
var jsonFormatterSettings = jsonFormatter.SerializerSettings;

jsonFormatterSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
jsonFormatterSettings.Formatting = Formatting.Indented



у меня получится JSON сложной структуры?

авторОчень просто: вызвать всю эту "куча функций, да при этом ещё и с десяток линкованых серверов со своими процедурами и таблицами" при добавлении данных,
а при выборке тупо вернуть готовый результат запросом вида: SELECT Column1, Column2, ..., ColumnN FROM Table.

skyANA, понимаете эта вся куча функций ... это один единый запрос, где таблицы связаны между собой юнионами, джоинами, потом транспонированы, и другие преобразования я вот ни как не могу понять зачем этот много-строчный запрос пихать в код программы?
Когда можно обойтись простым Exec в одну строчку.

Интересно, сколько по времени у Вас выполняется такая хранимая процедура? Что будет при нагрузке скажем в 20 запросов в секунду?
При правильном написании, и достаточных мощностях сервера, такая процедура выполняется за доли секунд.
К тому-же процедуры имеют планы и статистики, которые значительно ускоряют её работу.
Но это уже совсем другая история :)
...
Рейтинг: 0 / 0
27.10.2014, 17:48
    #38788504
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
RAVen42skyANA,
т.е. благодаря именно этому
Код: c#
1.
2.
3.
4.
5.
var jsonFormatter = System.Web.Http.GlobalConfiguration.Configuration.Formatters.JsonFormatter;
var jsonFormatterSettings = jsonFormatter.SerializerSettings;

jsonFormatterSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
jsonFormatterSettings.Formatting = Formatting.Indented



у меня получится JSON сложной структуры?Нет. Разве из кода не понятно, что происходит?

RAVen42авторОчень просто: вызвать всю эту "куча функций, да при этом ещё и с десяток линкованых серверов со своими процедурами и таблицами" при добавлении данных,
а при выборке тупо вернуть готовый результат запросом вида: SELECT Column1, Column2, ..., ColumnN FROM Table.

skyANA, понимаете эта вся куча функций ... это один единый запрос, где таблицы связаны между собой юнионами, джоинами, потом транспонированы, и другие преобразования я вот ни как не могу понять зачем этот много-строчный запрос пихать в код программы?
Когда можно обойтись простым Exec в одну строчку.А я и не предлагаю "много-строчный запрос пихать в код программы", читайте внимательно.

RAVen42Интересно, сколько по времени у Вас выполняется такая хранимая процедура? Что будет при нагрузке скажем в 20 запросов в секунду?
При правильном написании, и достаточных мощностях сервера, такая процедура выполняется за доли секунд.
К тому-же процедуры имеют планы и статистики, которые значительно ускоряют её работу.
Но это уже совсем другая история :)То есть конкретных показателей у Вас нет, только предположения. Не очень хорошо.

Планы и статистики-то имеются, но также имеется и такая штука как parameter sniffing, когда планы и статистики летят в трубу.
...
Рейтинг: 0 / 0
28.10.2014, 05:59
    #38788808
RAVen42
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
skyANA,
авторНет. Разве из кода не понятно, что происходит?
Если честно, то не совсем понятно.

авторА я и не предлагаю "много-строчный запрос пихать в код программы", читайте внимательно.
т.е. типа витрины данных сделать, да можно и так.

авторТо есть конкретных показателей у Вас нет, только предположения. Не очень хорошо.
пока что нет, так-как я только разбираюсь с самим процессом.

авторПланы и статистики-то имеются, но также имеется и такая штука как parameter sniffing, когда планы и статистики летят в трубу.
SQL я знаю очень хорошо
...
Рейтинг: 0 / 0
28.10.2014, 08:45
    #38788858
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сложный JSON
RAVen42skyANA,
авторНет. Разве из кода не понятно, что происходит?
Если честно, то не совсем понятно.JsonFormatter сам преобразует IEnumerable<Person> в JSON.
Я лишь сказал ему: "Писать имена свойств с маленькой буквы и использовать отступы".

RAVen42авторА я и не предлагаю "много-строчный запрос пихать в код программы", читайте внимательно.
т.е. типа витрины данных сделать, да можно и так.Нет, просто шаблон "Денормализация" использовать.

RAVen42авторТо есть конкретных показателей у Вас нет, только предположения. Не очень хорошо.
пока что нет, так-как я только разбираюсь с самим процессом.

авторПланы и статистики-то имеются, но также имеется и такая штука как parameter sniffing, когда планы и статистики летят в трубу.
SQL я знаю очень хорошо Странно, с одной стороны SQL знаете хорошо, с другой стороны конкретных показателей у Вас нет.
Ну да ладно, если знаете хорошо, то разберётесь в производительности.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / сложный JSON / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]