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

Linq Discussion :

LINQ DataContext Refresh


Sujet :

Linq

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Par défaut LINQ DataContext Refresh
    Bonjour à tous,

    Je me posais une petite question au sujet de la méthode Refresh d'un DataContext dans LINQ.

    Dans mon application, j'utilise LINQ pour l'accès à ma bd.
    Lors de l'actualisation d'affichage,et afin d'actualiser l'état d'entité qui aurait été modifié directement dans la base de données, je suis obligé d'utiliser le Refresh de mon datacontext.

    Cependant, lorsque j'actualise beaucoup d'entités, (15000 par exemple) cela augmente significativement le temps d'exécution de mes requètes, 5 à 10 secondes.

    - Aurions vous une solution pour obtenir les modifications parvenus dans la base de données sans utiliser le refresh ?

    - Est il possible de threader le Refresh ? Est ce judicieux de le faire ?

    J'ai essayé de rafraichir mon datacontext avec cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     private void ClearCache()
            {
                const BindingFlags FLAGS = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
     
                var method = GetLINQ().GetType().GetMethod("ClearCache", FLAGS);
                method.Invoke(GetLINQ(), null);
            }
    Cependant, cela n'a pas le même effet que le Refresh car cela me génère un autre datacontext et j'ai alors l exception suivante :

    Tentative d'attachement ou de création d'une entité qui n'est pas new, qui a peut-être été chargée à partir d'un autre DataContext. Cela n'est pas pris en charge.

    Merci d'avance !

  2. #2
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    Plutot que demander a tout rafraichir tout le temps, peut etre que tu devrait vérifier ce dont tu as besoin.
    par exemple tu stocke une date d'update en base et une date de dernier accès à la base de données dans ton application et tufais une requête sur la base en regardant s'il y a des éléments avec une date de mise a jour supérieur a ta date de dernier accès.

    Mais globalement le refresh est lent ... Car il va faire une requête par entité, si tu dois faire ca pour toutes tes entités tu ferrais mieux de recharger ces entités avec une seule requête.

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Par défaut
    Bonjour, c'est ce que je fais, en fait je rafraichis un ensemble d'entité en une seule fois, et cette ensemble est le résultat d'une requète

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    IQueryable<Prestation> matches = CAC.GetLINQ().Prestations.Where(pr => pr.Tier.RefDossier == CAC.DossierEnCours.NumDossier).OrderBy(pr => pr.Debut);
     
    //UN ENSEMBLE DE FILTRE FACULTATIFS SUR LA COLLECTION MATCHES
     
     
    CAC.GetLINQ().Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, matches);
    Dans cet exemple, il arrive que l'ensemble de ma collection matches comporte 15000 entités ...

  4. #4
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    On dirait qu'en interne il fait un appel par entité tout simplement.

    A vrai dire je connais pas bien le fonctionnement interne de linq to sql, je ne l'utilise pas car c'est une technologie basique, qui n'évolue pas et obsolète.

    Si tu n'est pas sur une reprise de projet tu devrais plutôt utiliser Entity Framework, il gère peut être mieux ce cas.

Discussions similaires

  1. Connection LINQ datacontext sur un serveur Distant
    Par strike57 dans le forum Linq
    Réponses: 2
    Dernier message: 16/11/2009, 22h45
  2. Linq To Sql, problème de refresh du datacontext
    Par Clarkgbl dans le forum Accès aux données
    Réponses: 1
    Dernier message: 16/03/2009, 15h51
  3. [LINQ] DataContext = Vue -> Update plante
    Par annalady dans le forum Accès aux données
    Réponses: 4
    Dernier message: 14/06/2008, 12h58
  4. Bind, DataContext via LINQ & Concurrence
    Par Nalfeim dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 23/05/2008, 14h51
  5. [Linq to SQL] Refresh du dbml
    Par zeavan dans le forum Visual Studio
    Réponses: 5
    Dernier message: 02/01/2008, 10h15

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