Précédent   Forum des professionnels en informatique > Dotnet > Accès aux données > Linq
Linq Forum d'entraide sur la manipulation de données avec Linq
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/09/2011, 09h18   #1
Invité régulier
 
Aude Masly
Inscription : janvier 2010
Messages : 34
Détails du profil
Informations personnelles :
Nom : Aude Masly

Informations forums :
Inscription : janvier 2010
Messages : 34
Points : 7
Points : 7
Par défaut Linq To Entities : Problème sur une requête

Bonjour à tous,

Je rencontre un problème pour réaliser une requête avec LINQ To Entities avec un Left Outer Join. Je vous explique le contexte. J’ai une table Client dans laquelle on trouve diverses infos (nom, …). Il a ensuite une table Contrat avec, là aussi, quelques informations (ref du contrat, …). Entre les deux, une table Souscription qui fait office d’intermédiaire. Elle contient une Date de souscription, une date de résiliation.

Un client peut donc souscrire à 0, 1 ou plusieurs contrats et on garde l’historique de ses anciennes souscriptions.



Mon objectif est de ressortir la liste complète des Clients avec le/les souscriptions actuelles (avec une Date de résiliation à null ou supérieure à la date du jour). Je dois bien évidemment récupérer les clients qui n’ont pas de souscriptions (soit car toutes les Souscriptions ont une date de résiliation passée, soit car il n’y a encore rien dans cette table).

La requête SQL pour faire cela est très simple :

Code :
1
2
3
4
SELECT
	*
FROM dbo.Client CLI
	LEFT OUTER JOIN dbo.Souscription SOU ON CLI.IdCli = SOU.IdCliAND (SOU.DtResilitation IS NULL OR SOU.DtResiliation > CURRENT_TIMESTAMP)
Rien de bien compliqué donc.

Mais pour faire cela en Linq to Entities, c’est beaucoup plus difficile. J’ai tout essayé sans succés. A chaque fois, il me manque des clients (ceux qui n’ont aucune donnée dans la table Souscription par exemple).

Comment faire une telle requête ?

Merci d'avance pour votre aide.
Sookie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2011, 22h21   #2
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 393
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 27
Localisation : Sénégal

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2007
Messages : 2 393
Points : 4 089
Points : 4 089
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
J'ai pas testé mais t'as essayé ça

Code C# :
1
2
3
4
5
6
 
var query = from clt in context.Clients
                join sub in context.Souscriptions on clt.IdCli equals sub.IdCli into ClientWithSubs
                where sub.DtResiliation > DateTime.Now
                from cltsub in ClientWithSubs.DefaultIfEmpty()
                select cltsub;
__________________
Les FAQs sur les technologies .Net voir ici
Les cours et tutos sur les technologies .Net voir ici
Les critiques sur les livres parlant des technologies .Net voir ici
Pensez à la balise [CODE]
Pensez au tag si votre problème est résolu

While(!success) { TryAgain(); }
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 08h23   #3
Invité régulier
 
Aude Masly
Inscription : janvier 2010
Messages : 34
Détails du profil
Informations personnelles :
Nom : Aude Masly

Informations forums :
Inscription : janvier 2010
Messages : 34
Points : 7
Points : 7
Bonjour,

Malheureusement, cette requête ne fonctionne pas.

Code :
1
2
3
var query = from clt in context.Clients
join sub in context.Souscriptions on clt.IdCli equals sub.IdCli into ClientWithSubs
where sub.DtResiliation > DateTime.Now
Dans le where, on a pas accés à "sub". On peut seulement utiliser "ClientWithSubs".
Sookie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 10h23   #4
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 393
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 27
Localisation : Sénégal

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2007
Messages : 2 393
Points : 4 089
Points : 4 089
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
Ah ouais je vois.

Mais as-tu pensé à avoir deux requêtes linq séparées. l'une avec les clients ayant les souscription avec ta condition et l'autre sans.
Une troisième a exécuter pour faire l'union des deux précédentes.
__________________
Les FAQs sur les technologies .Net voir ici
Les cours et tutos sur les technologies .Net voir ici
Les critiques sur les livres parlant des technologies .Net voir ici
Pensez à la balise [CODE]
Pensez au tag si votre problème est résolu

While(!success) { TryAgain(); }
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 10h36   #5
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 393
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 27
Localisation : Sénégal

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2007
Messages : 2 393
Points : 4 089
Points : 4 089
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
Sinon je viens de lire une discussion où iberserk proposait pour un problème a peu près le même de passer par une vue.

Etant donné que ta requête T-SQL te permet d'avoir ce que tu veux de façon très simple pourquoi ne pas créer une vue pour celle-ci et importer la vue dans ton modèle EDM.
__________________
Les FAQs sur les technologies .Net voir ici
Les cours et tutos sur les technologies .Net voir ici
Les critiques sur les livres parlant des technologies .Net voir ici
Pensez à la balise [CODE]
Pensez au tag si votre problème est résolu

While(!success) { TryAgain(); }
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 14h28   #6
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Sinon je viens de lire une discussion où iberserk proposait pour un problème a peu près le même de passer par une vue.
Merci pour la pub

Vous pouvez aussi passer par une fonction table (SQL)si vous le souhaitez.

La fonction table est IQUERYABLE contrairement à la procédure stockée et peu accepter des paramètres.
pour exemple vous pourriez arriver à ca:
Code :
1
2
 
var result=context.FN_GET_CLIENTS_WITH_CONTRACTS(DateTime.Now());
Sinon en LINQ celà ne fonctionne pas?
Code :
1
2
3
4
 
var query = from clt in context.Clients
                join sub in context.Souscriptions on clt.IdCli equals sub.IdCli into ClientWithSubs
                select ClientWithSubs.DefaultIfEmpty().Where(a=>a.DtResiliation > DateTime.Now or a.DtResiliation  ==null);
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h38.


 
 
 
 
Partenaires

Hébergement Web