Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

LinqToSQL + Silverlight 2 + WCF

4 réponses
Avatar
Cololi
Bonjour,

J'ai un soucis :

Le contexte :
Je travaille sous Visual Studio 2008, en C# avec le FrameWork 3.5,
Silverlight 2 et SQL Server 2005.

Je tente d'utiliser le composant "DataGrid" de Silverlight pour afficher des
données d'une base.
L'accés à la base se fait via LinqToSQL.
Pour celà il faut créer un service WCF.

Le problème :
J'ai crée une fontion du service WCF qui interroge la base. Elle marche.
Le soucis c'est que la fonction renvoie une List<NomTable>, et que de
l'autre Silverlight ne retrouve pas ses petits.
Si ma fonction retourne une List<string> ça marche très bien.

J'ai déjà changer la sérialisation de la classe générée par LINQToSQL à
Unidirectionnal.
Mais ça ne change rien. Que faire ?

4 réponses

Avatar
Jérémy Jeanson
Bonjour Cololi,

As tu bien vérifié que les entités que tu voulais faire passer via WCF
avait leur propriété indiquées comme faisant partit du contrat de
données attibuts DataContract pour les classes et DataMember pour leur
propriérés ?
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Cololi
J'ai vérifié, ça y est bien , et je psen que c'est le fait de faire
"Sérialisation : Unidirectionnal" qui fait ça :

Je précise que la classe ci dessous est dans le fichier généré par LinqToSQL
et non dans le ficheir du service (ce qui n'empêche pas le service d'y
accéder correctement, car j'y ai fait des requetes qui fonctionnent) :

[Table(Name="dbo.LANGUE")]
[DataContract()]
public partial class LANGUE : INotifyPropertyChanging, INotifyPropertyChanged
{

private static PropertyChangingEventArgs emptyChangingEventArgs = new
PropertyChangingEventArgs(String.Empty);

private int _ID_LANGUE;

private string _NOM_LANGUE;

private string _CODE_ISO;

#region Extensibility Method Definitions
partial void OnLoaded();
partial void OnValidate(System.Data.Linq.ChangeAction action);
partial void OnCreated();
partial void OnID_LANGUEChanging(int value);
partial void OnID_LANGUEChanged();
partial void OnNOM_LANGUEChanging(string value);
partial void OnNOM_LANGUEChanged();
partial void OnCODE_ISOChanging(string value);
partial void OnCODE_ISOChanged();
#endregion

public LANGUE()
{
this.Initialize();
}

[Column(Storage="_ID_LANGUE", AutoSync=AutoSync.OnInsert, DbType="Int NOT
NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
[DataMember(Order=1)]
public int ID_LANGUE
{
get
{
return this._ID_LANGUE;
}
set
{
if ((this._ID_LANGUE != value))
{
this.OnID_LANGUEChanging(value);
this.SendPropertyChanging();
this._ID_LANGUE = value;
this.SendPropertyChanged("ID_LANGUE");
this.OnID_LANGUEChanged();
}
}
}

"Jérémy Jeanson" wrote:

Bonjour Cololi,

As tu bien vérifié que les entités que tu voulais faire passer via WCF
avait leur propriété indiquées comme faisant partit du contrat de
données attibuts DataContract pour les classes et DataMember pour leur
propriérés ?
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr



Avatar
Jérémy Jeanson
Oups... pardon LinqToSql, j'ai égaré une paire de neurones au moment de
répondre à ta question...

Attention à LinqToSql et les services + WCF :
- dans un premier temps il ne faut pas compter sur les liaisons que tu
peux avoir entre tes classes : EntitySet et EntityRef reisqueraient de
te poser de très gros soucis côté client, il faut donc bien penser aux
requetes que tu fais côté service.

- Ensuite (ce qui peut être ton souci) il faut éviter d'utiliser un
IEnumerable<> en sortie, car celui-ci ne garanti pas que ta requête se
soit exécute et que ce soit son résultat qui soit retourné... et donc
côté client on peut avoir des erreur car forcément vu que le context
LinqToSql est côté du serveur du service il n'existe pas côté client
silverlight. à la place il est plus courant d'utiliser un tableau (vive
la méthode ToArray() de Linq) en faisant ta conversion avec ToArray() tu
serras alors certain que tes données on été énumérés.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Cololi
Le 1° point que tu soulèves, je ne le pige pas. Je parle de LinqToSQL et non
de LinqToEntity.

Le 2° point : impossible j'ai fait un ToList() :
Voici le code dans le fichier service, je vois pas où est le pb :/

namespace SilverlightApplication2.Web
{
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode =
AspNetCompatibilityRequirementsMode.Allowed)]
public class LanguesService
{
[OperationContract]
public List<LANGUE> DoWork()
{
DataClasses1DataContext db = new DataClasses1DataContext();
List<LANGUE> tmp = db.LANGUE.Select(l => l).ToList();
return tmp;
}
}
}

(avec le debugger j'ai bien vérifié ... la requête se fait bien, c'est le
service, qui ne reçoit pas les valeurs : problème qui ne se pose pas, quand
la requete consiste à retourner une liste de string).

"Jérémy Jeanson" wrote:

Oups... pardon LinqToSql, j'ai égaré une paire de neurones au moment de
répondre à ta question...

Attention à LinqToSql et les services + WCF :
- dans un premier temps il ne faut pas compter sur les liaisons que tu
peux avoir entre tes classes : EntitySet et EntityRef reisqueraient de
te poser de très gros soucis côté client, il faut donc bien penser aux
requetes que tu fais côté service.

- Ensuite (ce qui peut être ton souci) il faut éviter d'utiliser un
IEnumerable<> en sortie, car celui-ci ne garanti pas que ta requête se
soit exécute et que ce soit son résultat qui soit retourné... et donc
côté client on peut avoir des erreur car forcément vu que le context
LinqToSql est côté du serveur du service il n'existe pas côté client
silverlight. à la place il est plus courant d'utiliser un tableau (vive
la méthode ToArray() de Linq) en faisant ta conversion avec ToArray() tu
serras alors certain que tes données on été énumérés.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr