2012-11-18 2 views
1

J'interroge la base de données à l'aide de Linq to Sql. Voici mes données:Linq to Sql Requête renvoyant le même enregistrement deux fois

 Name  LastName  Age 
    ------------------------------ 
1 Abc   Def   15 
2 Abc   Def   17 
3 xyz   wss   17 

Mon code LINQ to Sql est:

Context _context = new Context("Conn_String"); 
var table = _context.GetTable<Person>(); 
List<Person> persons = table.Where<Person>(p => p.Name == "Abc" && p.LastName == "Def").ToList<Person>(); 

Selon ma compréhension, cette requête devrait retourner 2 enregistrements. c'est-à-dire enregistrement 1 et enregistrement 2. Mais il retourne l'enregistrement 1 deux fois. Pouvez-vous m'éclairer si c'est un bug dans Linq to Sql ou quelque chose que je fais mal?

EDIT:

Ceci est mon Code DAL:

public List<T> GetList<T>(Expression<Func<T, bool>> predicate) where T : class 
{ 
    try 
    { 
      Context _context = new Context("Conn_String"); 
      var table = _context.GetTable<T>(); 
      return table.Where<T>(predicate).ToList<T>(); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
} 

J'appelle cette méthode:

List<Person> person = DAL.GetList<Person>(p => p.Name == "Abc" && p.LastName == "Def"); 

foreach(var Person in persons) 
{ 
    // Print(person.Age); 
} 
+1

Il y a des chances, il y a quelque chose de mal avec vos diagnostics. Veuillez montrer comment vous déterminez que le même enregistrement est renvoyé deux fois. –

+0

Oui. J'utilise LINQ (mais pas SQL) de manière intensive depuis des années dans des projets d'entrepôt de données, entre autres choses et je n'ai jamais vu cela. Je commencerais par déboguer le niveau SQL - voir l'instruction générée sur la base de données, puis voir ce que le serveur sql y retourne en l'exécutant dans l'application de gestion. C'est 99,9% un mauvais diagnostic. – TomTom

+0

Les enregistrements renvoyés indiquent Age = 15 pour les deux enregistrements. –

Répondre

1

Salut Usman,

Ceci est ma table:

enter image description here

Ici j'utilise la requête suivante:

using (DataClassesDataContext dc = new DataClassesDataContext()) 
     { 
      var v = (from c in dc.t_controls where (c.config_display == "SHOW_VA" && c.next_value == 1) select c.description).ToList(); 
     } 

Cette requête renvoie tous les 5 rows.Take il comme référence et vérifiez où vous vous trompez. J'espère que cela vous aidera.

+0

Je n'utilise pas de syntaxe (de c dans dc.t_controls) .......J'utilise Context _context = new Context ("Conn_String"); var table = _context.GetTable (); table de retour.Où (prédicat) .ToListe (); Peut-être que c'est pourquoi je suis confronté à ce comportement. –

+0

Peut-être, Mais avez-vous résolu votre problème en utilisant ma solution ou non? – Sunny

1

Pouvez-vous exécuter votre requête et profil à l'aide de SQL Server profiler (en supposant SQL Server) dans la base de données se. Je me demande si vous avez des enregistrements en double dans votre table .. ou s'il y a une jointure causant des doublons. J'ai utilisé LINQ to SQL sans problèmes. J'ai utilisé LINQ to SQL.

Si le profil de base de données est correct et que vous voulez le "forcer" à être unique, vous pouvez toujours passer une méthode distincte dans votre requête LINQ à la fin.

4

Je viens de rencontrer moi-même ce problème. Vérifiez quelle propriété le modèle a inféré être votre clé d'entité pour votre classe Person.

Si elle a une colonne non unique comme la clé de l'entité elle utilisera la première ligne qui correspond à la valeur pour chaque ligne lors de la conversion en utilisant ToList()