2016-09-21 2 views
1

Я пытаюсь без успеха преобразовать тип, предоставленный sqlprovider в json.преобразовать sqlprovider типизированный объект в строку json

У меня есть метод:

let getAll() = 
    query { 
     for c in db.MyDb.Table do 
     select c 
    } 

тогда я называю его Newtonsoft.Json как таковой:

JsonConvert.SerializeObject(getAll()) 

Что я получаю это строка с пустым объектом: [{}]

Если я создайте тип вручную, все будет хорошо. Он также работает, если я выбираю примитивный тип и один атрибут, например c.something.

Я предполагаю, что я что-то основное хватает (надеюсь;))

+0

Можете ли вы попробовать 'JsonConvert.SerializeObject (Array.ofSeq (getAll()))'? –

+0

Да, я пробовал это и пытался допросить запрос с помощью '|> Seq.toArray'. Оба не помогли, тот же результат. –

+0

это «работает» для меня. То есть в условиях, которые я тестировал. MS SQL, случайную таблицу, получение всех записей из этой таблицы и запуск «вашего» getAll(). Какую версию Newtonsoft у вас есть? У меня 9.0.1 ... –

ответ

1

Этот тип использования упоминается в Issue 212. Поскольку созданный тип SqlEntity не является тем, о чем знает сериализатор Json, он не сможет справиться с ним напрямую. Один из способов обойти это - определить типы записей для таблиц (что может не понравиться для больших таблиц). Так, например:

type DataRec' = { 
    DT:DateTime 
    ADAY:String 
    ID:System.Int64 
    } 

let qry = query { for row in table1 do 
        select row} |> Seq.map (fun x -> x.MapTo<DataRec'>()) 

JsonConvert.SerializeObject(qry |> Seq.toList) 

вал это: String =
"[{" DT ":" 2016-09-27T00: 00: 00" , "ADAY": "Вторник", "ID" : 8}, { "DT": "2016-09-26T00: 00: 00", "ADAY": "понедельник", "ID": 9}, { "DT": "2016-09-25T00: 00: 00" , "ADAY": "воскресенье", "ID": 10}, { "DT": "2016-09-24T00: 00: 00", "ADAY": "Суббота", "ID": 11}, { "DT": "2016-09-27T00: 00: 00", "ADAY": "Вторник", "ID": 12}, { "DT": "2016-09-24T00: 00: 00",» ADAY ":" Суббота», "ID": 13}, { "DT": "2016-09-24T00: 00: 00", "ADAY": "Суббота", "ID": 14}, { "DT" : "2016-09-23T00: 00: 00", "ADAY": "Пятница", "ID": 15}, { "DT": "2016-09-25T00: 00: 00", "ADAY":» Воскресенье "," ID ": 16}, {" DT ":" 2016-09-26T00: 00: 00 "," ADAY ":" Monday "," ID ": 17}]"

+0

Это, безусловно, работает, скорее, поражение цели поставщика типов. Спасибо @ s952163 за исследование. –

Смежные вопросы