/ / Serialize os resultados do Linq diretamente para JSON - c #, linq, json, serialização, objectquery

Serialize os resultados do Linq diretamente para JSON - c #, linq, json, serialização, objectquery

Eu estou desenvolvendo um WebService que excecute linq parasql db e colocar os resultados em uma variável VAR. Então eu quero serializar o resultado dentro do formato VAR para json usando o serializador javascript (c #). Algo assim:

var sb= from p in ent.people .........
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new       System.Runtime.Serialization.Json.DataContractJsonSerializer(sb.GetType());
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, sb);
string json = System.Text.Encoding.Default.GetString(ms.ToArray());

Mas eu recebo uma resposta de erro como isto:

Type      'System.Data.Objects.ObjectQuery`1[<>f__AnonymousType2d`5[System.String,System.Nu llable`1[System.Int32],System.Nullable`1[System.Int32],System.Int32,System.String]]' cannot be serialized.

Considere marcá-lo com oAtributo DataContractAttribute e marcando todos os seus membros que você deseja serializados com o atributo DataMemberAttribute. Se o tipo for uma coleção, considere marcá-lo com o CollectionDataContractAttribute. Consulte a documentação do Microsoft .NET Framework para outros tipos suportados.

COMO POSSO SUSTENTABILAR OS RESULTADOS DO LINQ DIRETAMENTE AO JSON ?? Muito obrigado por todas as respostas! Enrico

Respostas:

4 para resposta № 1

O DataContractJsonSerializer não suporta objetos anônimos. Se você deseja serializar objetos anônimos, pode usar o JavaScriptSerializer classe:

var sb = from p in ent.people .........
var serializer = new JavaScriptSerializer();
string json = serializer.Serialize(sb);

0 para resposta № 2

No meu último trabalho, vimos esse comportamento e demorou um pouco para contornar isso.

Primeiro, você quer o QI Toolkit, disponível emCodePlex gratuitamente. Em suas bibliotecas, há um "PartialEvaluator" que pode reduzir a complexidade de muitas árvores de expressão, encontrando nós que sempre avaliam os nós mais simples e substituindo as referências a "closures externos" por constantes. Você vai querer executar o seu IQueryable através disso antes de tentar serializá-lo.

Então, para usar o JSON DataContractserializador, você deve configurar a classe que deseja serializar como um DataContract. Existem tutoriais para fazer isso em todo o lugar; basicamente você apenas decora a classe, quaisquer classes contidas e os membros que deseja serializar com atributos.

Depois de ter essas duas coisas em vigor, seu objeto e seu membro IQueryable devem ser serializáveis ​​para JSON usando o DataContractJsonSerializer.


0 para resposta № 3

você pode usar Newtonsoft.JSON por isso

heres é a sintaxe

var sb = from p in ent.people .........
string json = JsonConvert.SerializeObject(sb);