IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entity Framework Discussion :

Problème de transformation sql -> EF


Sujet :

Entity Framework

  1. #1
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut Problème de transformation sql -> EF
    Bonjour,

    J'ai une grosse requête sql de la mort à transformer et j'obtiens ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var productProductLines = db.Products
                    .Where(p => p.IsActiv == true
                        && p.Product_ProductLines.Any(pl => pl.ProductLine.CustomerStock.Customer.Employee.SiteId == (int)siteId))
                    .SelectMany(p => p.Product_ProductLines).Distinct();
     
                productProductLines = productProductLines.Where(p => p.ProductLine.CustomerStock.Customer.Employee.SiteId == (int)siteId);
    jusque là pas de problème !

    mais je n'arrive pas à transformer un filtre optionnel codé comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                if (!string.IsNullOrWhiteSpace(rbPhoto))
                    if (rbPhoto.Equals("Oui"))
                        query.Append(" And Case when exists (select * from fichiers with(nolock) where fic_nom_origine = 'ART_ID' and fic_id_origine = art_id) then 0 else art_prise_photo end = 1 ");
                    else if (rbPhoto.Equals("Non"))
                        query.Append(" And Case when exists (select * from fichiers with(nolock) where fic_nom_origine = 'ART_ID' and fic_id_origine = art_id) then 0 else art_prise_photo end = 0 ");
    sachant que fic_id_origine pointe vers la PK de la table Product.
    Comme vous pouvez le comprendre, je n'arrive pas à coder les clauses correspondantes au retour de mes radiobutton.

    merci pour votre aide.

    Je tiens à préciser qu'il s'agit bien d'un problème algorithmique... J'ai déjà tatonné comme ci dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                if (!string.IsNullOrWhiteSpace(rbtPhoto))
                {
                    //if (rbtPhoto.Equals("Oui"))
                    //    productProductLines = productProductLines.Where(p => !(p.Product.Files.Where(f => f.ItemOrigin == "ART_ID").Count() > 0) || p.Product.TakePhoto);
                    //else if (rbtPhoto.Equals("Non"))
                    //    productProductLines = productProductLines.Where(p => !(!(p.Product.Files.Where(f => f.ItemOrigin == "ART_ID").Count() > 0) || p.Product.TakePhoto));
     
                    ViewBag.RbtPhoto = rbtPhoto;
                }
    mais le résultat obtenu n'est pas celui attendu.
    En informatique, le problème se situe toujours entre le clavier et l'écran !
    Il y a deux chemins entre le clavier et l'écran : Par l'UC et par l'utilisateur.

  2. #2
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Ok, ce point est réglé car la règle était mal codée dans le projet originelle.

    par contre, il me reste un gros morceau à faire... et là, c'est le drame !
    Voici la requête complète :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    SELECT
    			dbo.articles.art_id,
    			dbo.articles.art_ref_client,
    			dbo.articles.art_libelle,
    			dbo.stocksclients.stkclt_nom,
    			dbo.familles.fam_libelle, 
    			dbo.fournisseurs.frn_nom, 
    			dbo.operations.ope_id, 
    			dbo.operations.ope_libelle, 
    			uc_libelle = uc.uc_libelle, 
    			dbo.articles.art_qte_par_uc, 
    			ud_libelle = ud.uc_libelle, 
    			dbo.articles.art_qte_par_ud, 
    			dbo.typesarticles.tart_libelle,  
    			dbo.articles.art_prix_vente, 
    			dbo.articles.art_actif, 
    			dbo.operations.ope_nbr_reference, 
    			dbo.stocksclients.stkclt_id, 
    			dbo.stocksclients.stkclt_id_clt,  
    			dbo.fournisseurs.frn_id, 
    			dbo.typesarticles.tart_id, 
    			dbo.familles.fam_id, 
    			dbo.articles.art_date_creation, 
    			art_id_stk = (case
     						when exists(select top 1 0  from activites with(nolock) where(act_actif = 1) and act_id_ope in(stkclt_id_clt, (select ope_id from operations with(nolock) where act_id_ope = ope_id and ope_id_clt = stkclt_id_clt)))  
    						then ag_qte_disponible
    						else (select  sum(dbo.detailsmouvements.dmvt_qte) as sum_stock 
    								from  dbo.mouvements with(nolock) 
    									inner join dbo.detailsmouvements with(nolock) on dbo.mouvements.mvt_id = dbo.detailsmouvements.dmvt_id_mvt 
    								where(isnull(dbo.mouvements.mvt_statut, 3) = 3) 
    									and(dbo.mouvements.mvt_id_tmvt <> 1) 
    									and(dbo.mouvements.mvt_id_tmvt <> 6) 
    									and dmvt_id_art = dbo.articles.art_id and dmvt_id_gam = gammes.gam_id)
    						end),
    			nullif(dbo.articles.art_poids_unite, 0) as art_poids_unite, 
    			dbo.gammes.gam_id as art_id_gam, 
    			dbo.articles.art_photo,  
    			dbo.articles.art_prix_achat, 
    			cast(case 
    					when art_photo is null 
    						then 0 
    					when len(art_photo) = 0 
    						then 0 
    					else 1
    				end as bit)  as art_blnphoto, 
    			dbo.gammes.gam_id, 
    			dbo.gammes.gam_libelle, 
    			art_extranet, 
    			art_seuil_alerte,
    			art_delai_reapro,
    			art_qte_max_palette
     
    	FROM dbo.articles with (nolock)
    		inner join dbo.articles_gam  with(nolock) on dbo.articles_gam.ag_id_art = dbo.articles.art_id 
    		inner join dbo.gammes  with(nolock) on dbo.gammes.gam_id = dbo.articles_gam.ag_id_gam 
    		inner join dbo.stocksclients  with(nolock) on dbo.gammes.gam_id_stk = dbo.stocksclients.stkclt_id  
    		inner join dbo.familles  with(nolock) on dbo.articles.art_id_fam = dbo.familles.fam_id  
    		inner join dbo.typesarticles   with(nolock) on dbo.articles.art_id_tart = dbo.typesarticles.tart_id  
    		inner join dbo.unitesconditionnements uc  with(nolock) on dbo.articles.art_id_uc = uc.uc_id
    		left join dbo.unitesconditionnements ud  with(nolock) on dbo.articles.art_id_ud = ud.uc_id 
    		left outer join dbo.operations  with(nolock) on dbo.articles.art_id_ope = dbo.operations.ope_id 
    		left outer join dbo.fournisseurs  with(nolock) on dbo.articles.art_id_frn = dbo.fournisseurs.frn_id 
    		inner join(select clt_id
    						from clients with(nolock) 
    							inner join collaborateurs with(nolock) on clients.clt_id_clb = collaborateurs.clb_id 
    						where  collaborateurs.clb_id_site = 9
    					) clt on stkclt_id_clt = clt.clt_id
     
    WHERE art_actif = 1
    et voici ce que j'ai fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                var productProductLines = db.Products
                    .Where(p => p.Product_ProductLines.Any(pl => pl.ProductLine.CustomerStock.Customer.Employee.SiteId == (int)siteId))
                    .SelectMany(p => p.Product_ProductLines).Distinct();
     
                productProductLines = productProductLines.Where(p => p.ProductLine.CustomerStock.Customer.Employee.SiteId == (int)siteId);
    ça marche très bien. SAUF que je ne sais pas comment traiter la partie suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    			art_id_stk = (case
     						when exists(select top 1 0  from activites with(nolock) where(act_actif = 1) and act_id_ope in(stkclt_id_clt, (select ope_id from operations with(nolock) where act_id_ope = ope_id and ope_id_clt = stkclt_id_clt)))  
    						then ag_qte_disponible
    						else (select  sum(dbo.detailsmouvements.dmvt_qte) as sum_stock 
    								from  dbo.mouvements with(nolock) 
    									inner join dbo.detailsmouvements with(nolock) on dbo.mouvements.mvt_id = dbo.detailsmouvements.dmvt_id_mvt 
    								where(isnull(dbo.mouvements.mvt_statut, 3) = 3) 
    									and(dbo.mouvements.mvt_id_tmvt <> 1) 
    									and(dbo.mouvements.mvt_id_tmvt <> 6) 
    									and dmvt_id_art = dbo.articles.art_id and dmvt_id_gam = gammes.gam_id)
    						end),
    Durant un instant, après avoir retourné le machin dans tous les sens, je me suis demandé s'il ne vaudrait pas mieux transformer ce bordel sans nom en vue...
    Si vous avez d'autres solutions plus élégantes (et performantes => gros volume), merci à vous.
    En informatique, le problème se situe toujours entre le clavier et l'écran !
    Il y a deux chemins entre le clavier et l'écran : Par l'UC et par l'utilisateur.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Salut,

    Je ne vas pas te proposer de requête linq.
    Mais tu peux mapper un procédure stocker (vue, select,...) en utilisant "SqlQuery" (voir lien)

  4. #4
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    je vais encore moins t'aider que katkiller, j'ai plutôt une question pour toi :
    qu'est-ce qui a motivé le choix de passer son SQL en version EF/Linq ?
    Plus je connais de langages, plus j'aime le C.

  5. #5
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    J'ai opté pour la vue... Je teste...

    @jopopmk c'est dans le cadre d'un développement d'un module indépendant qui reprend certains écrans existants. Le nouveau développement se fait avec MVC 5 et EF 6.
    d'où ce choix pour reprendre les anciens écrans.
    En informatique, le problème se situe toujours entre le clavier et l'écran !
    Il y a deux chemins entre le clavier et l'écran : Par l'UC et par l'utilisateur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de requête SQL avec instruction TRANSFORM
    Par Nosper dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/06/2005, 16h15
  2. [Interbase] Problème de syntaxe SQL
    Par navis84 dans le forum InterBase
    Réponses: 4
    Dernier message: 22/12/2004, 17h07
  3. Problème de requète SQL dans un Requery
    Par Keraccess dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/10/2004, 14h58
  4. Problème Access to Sql Server
    Par vuldos dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/08/2004, 15h56
  5. Réponses: 3
    Dernier message: 18/11/2002, 16h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo