2017-10-02 1 views
2

Considérons un environnement avec divers ordinateurs à différents endroits. Ces ordinateurs ont une application Windows en cours d'exécution et une minuterie pour la vérification des nouvelles données à synchroniser toutes les 5 minutes. Les informations sont synchronisées à un emplacement centralisé via une connexion Internet. La base de données sur les ordinateurs clients et le serveur centralisé est une base de données SQL Server.Est-ce que SingleOrDefault() interroge à distance?

Avant d'écrire dans le serveur distant (centralisé), la méthode SingleOrDefault() est utilisée pour vérifier si un enregistrement avec le même ID existe à distance ou non. Le client a signalé une augmentation des données Internet utilisées. Je me demande si la base de données centralisée est devenue trop grande et SingleOrDefault renvoie l'ensemble des données interrogeables sur la connexion et fait le côté client d'interrogation. Cela pourrait-il être le cas? Et quelle serait une solution alternative qui ne ferait pas la même chose?

+1

Puisque vous interrogez par clé primaire, vous savez qu'il n'y a qu'un seul élément. Pensez à utiliser firstOrDefault au lieu de SingleOrDefault, car le premier interrogera Top 1, tandis que le second interrogera Top 2 et vérifiera qu'il n'y en a pas un second. Cette vérification supplémentaire n'a aucun but dans votre cas. –

+0

D'accord, il ne peut y avoir de doublons par règle SQL. SingleOrDefault n'interroge pas le côté client mais je vais corriger cela néanmoins –

Répondre

3

Si vous utilisez Queryable.SingleOrDefault alors il sera traité sur le serveur (si vous vous connectez les requêtes de base de données, vous pouvez voir l'utilisation de top 2 dans le select).

Toutefois, si vous utilisez Enumerable.SingleOrDefault alors il sera traité sur le client (base de données).

Vous devez éviter de passer de IQuerable<T> à IEnumerable<T> (par exemple en utilisant AsEnumerable).

Détection cela peut être fait avec l'inspection de code ou en regardant le SQL généré.

top 2 est utilisé pour détecter plus d'un seul résultat, qui est une erreur lors de l'utilisation SingleOrDefault.

+0

Merci pour la réponse informative et claire. Cela signifie que la quantité exorbitante de données Internet doit être la cause de quelque chose d'autre, car la méthode est IQuerayble.SingleOrDefault. –

+0

pourquoi ce serait «top 2»? n'est-ce pas dire 'SIngleOrDefault' qui signifie qu'un enregistrement est attendu. –

+0

@EhsanSajjad Voir la note! Obtenir deux lignes mènera à une exception. 'Single' signifie erreur si ce n'est pas exactement 1; 'SingleOrDefault' signifie 0, 1 ou erreur. Si vous souhaitez autoriser plus d'une ligne, utilisez 'FirstOrDefault'. – Richard