2010-03-15 5 views
0

ici est mon scénario je suisrelations linq2sql et problème de sérialisation WCF

Tableau 1

  • id
  • Nom

Tableau2

  • id
  • famille
  • fid

avec un à plusieurs relations situé entre Table1. id et Table2.fid

Voici mon WCF code de service

[OperationContract] 

public List<Table1> GetCustomers(string numberToFetch) 
{ 
    using (DataClassesDataContext context = new DataClassesDataContext()) 
    { 
     return context.Table1s.Take(int.Parse(numberToFetch)).ToList(); 
    } 
} 

et ma page ASPX code

<body xmlns:sys="javascript:Sys" 
    xmlns:dataview="javascript:Sys.UI.DataView"> 
    <div id="CustomerView" 
     class="sys-template" 
     sys:attach="dataview" 
     dataview:autofetch="true" 
     dataview:dataprovider="Service2.svc" 
     dataview:fetchParameters="{{ {numberToFetch: 2} }}" 
     dataview:fetchoperation="GetCustomers"> 
     <ul> 
      <li>{{family}}</li> 
     </ul> 
    </div> 

si je définir le mode de sérialisation à unidirectionnelles dans le concepteur Linq2Sql je ne suis pas en mesure de obtenir la valeur de la famille et tout ce que je reçois est-ce dans firebug

{"d":[{"__type":"Table1:#","id":1,"name":"asd"},{"__type":"Table1:#","id":2,"name":"wewe"}]} 

toute aide serait tout à fait apprécié

Répondre

1

Eh bien, le point est: votre méthode GetCustomers ne sélectionne jamais de Table1 - Je ne vois aucune référence du tout à Table2, où votre colonne Family est situé ......

Vous besoin de vérifier dans Linq-to-SQL JOIN et comment extraire les données d'une table jointe dans votre jeu de résultats.

Quelque chose le long des lignes de:

[DataContract] 
class JoinedResult 
{ 
    [DataMember] 
    public int Table1ID { get; set; } 
    [DataMember] 
    public string Table1Name { get; set; } 
    [DataMember] 
    public string Table2Family { get; set; } 
} 

[OperationContract] 
public List<JoinedResult> GetCustomers(int numberToFetch) 
{ 
    using (DataClassesDataContext context = new DataClassesDataContext()) 
    { 
     var q = from t1 in context.Table1 
       join t2 in context.Table2 on t1.id = t2.fid 
       select new JoinedResult 
          { Table1ID = t1.ID, 
          Table1Name = t1.Name, 
          Table2Family = t2.Family }; 

     return q.Take(numberToFetch).ToList(); 
    } 
} 

et BTW: vous devriez vraiment faire numberToFetch un paramètre INT! Laissez l'appelant faire la conversion ......

MISE À JOUR: si vous ne voulez pas inclure explicitement la deuxième table à interroger, vous pouvez ajouter une place DataLoadOption à votre contexte:

DataLoadOptions dlo = new DataLoadOptions(); 
dlo.LoadWith<Table1>(t => t.Table2); 

context.LoadOptions = dlo; 

Dans ce cas, vous devez indiquer à LINQ d'inclure tous les éléments de Table2 lorsqu'il charge quelque chose de Table1 - cela devrait également fonctionner.

+0

merci beaucoup pour la réponse, je peux me tromper, mais avec Linq2sql mapping table2 est une propriété de table1 donc il n'y a pas besoin de rejoindre et je peux y accéder comme Table1.Table2, corrigez-moi si je me trompe s'il vous plaît. – DevMania

+0

@devmania: oui, vous pourriez - mais cela ne signifie pas qu'il est sérialisé au client. Lorsque vous sélectionnez * uniquement * dans la Table1, Linq-to-SQL n'inclut pas non plus toutes les propriétés Table2. Si vous voulez, vous devez le demander. Mais vous avez raison - vous pourriez écrire: 'Table2Family = t1.Table2.Family »comme la dernière ligne dans l'instruction select dans LINQ –

+0

bro merci beaucoup pour votre réponse détaillée, mais le fait est que je crée un système enfichable, donc je veux juste prendre les nouvelles tables enfant sans rééditer mon WCF code, donc dataoption ne fonctionnera pas parce que je dois rééditer chaque fois que j'ajoute un nouveau plugin, cela me rend vraiment fou – DevMania