2010-04-08 7 views
6

J'essaie de comprendre pourquoi une requête simple dans LINQ renvoie des résultats impairs.Requête LINQ renvoyant plusieurs copies du premier résultat

J'ai une vue définie dans la base de données. Il rassemble essentiellement plusieurs autres tables et fait quelques manipulations de données. Ce n'est vraiment rien de spécial, sauf pour le fait qu'il traite un grand ensemble de données et peut être un peu lent.

Je souhaite interroger cette vue en fonction d'un long chemin. Deux exemples de requêtes ci-dessous montrent différentes requêtes à cette vue.

var la = Runtime.OmsEntityContext.Positions.Where(p => p.AccountNumber == 12345678).ToList(); 

var deDa = Runtime.OmsEntityContext.Positions.Where(p => p.AccountNumber == 12345678).Select(p => new { p.AccountNumber, p.SecurityNumber, p.CUSIP }).ToList(); 

Le premier doit renvoyer une liste. Le second sera une liste d'objets anonymes.

Lorsque je fais ces requêtes dans le framework d'entités, le premier me renvoie une liste de résultats où ils sont tous exactement les mêmes.

La deuxième requête me renvoie des données où le numéro de compte est celui que j'ai interrogé et les autres valeurs diffèrent. Cela semble se faire par numéro de compte, c'est-à-dire que si je demandais un numéro de compte ou un autre, tous les objets Position d'un compte auraient la même valeur (le premier dans la liste des Positions pour ce compte) et le deuxième compte aurait un ensemble d'objets Position ayant tous la même valeur (encore une fois, le premier dans sa liste d'objets Position).

Je peux écrire SQL qui est en fait le même que l'une des deux requêtes EF. Ils reviennent tous les deux avec des résultats (disons quatre) qui montrent les données correctes, un numéro de compte avec différents numéros de titres.

Pourquoi cela se produit-il ??? Y a-t-il quelque chose que je pourrais faire de mal, alors si j'avais quatre résultats pour la première requête ci-dessus, les données du premier enregistrement apparaîtraient également dans les objets du 2-4ème?

Je n'arrive pas à comprendre ce qui pourrait ou pourrait causer cela. J'ai cherché Google pour toutes sortes de mots-clés et je n'ai vu personne avec ce problème. Nous classons partiellement la classe Positions pour des fonctionnalités supplémentaires (objet intelligent) et certaines propriétés intelligentes. Il y a même quelques constructeurs qui fournissent un support de type de modèle de vue. Rien de tout cela n'est invoqué dans la demande (j'en suis sûr à 99%). Cependant, nous faisons ce même modèle partout dans l'application.

La seule chose que je peux penser est que le mappage dans l'EDMX est vicieux. Y a-t-il un moyen que cela se produise si les «clés primaires» de l'EDMX n'étaient pas en fait uniques compte tenu de la façon dont la vue est construite? Je pense que les développeurs qui ont importé ce modèle dans l'EDMX ont laissé le concepteur sélectionner automatiquement ce qui serait unique.

Toute aide donnerait un peu d'espoir à un devin haggered!

+3

Saisissez le script SQL généré et exécutez-le de manière interactive dans Management Studio pour voir ce qui se passe réellement –

+0

Comme indiqué, utilisez peut-être un profileur pour examiner le SQL en cours d'exécution. –

Répondre

13

La réponse à cette question est la suivante:

Assurez-vous que TOUCHES SONT UNIQUE ENTITÉ! !!

La vue telle qu'elle a été générée dans l'EDMX a trois colonnes/propriétés qui ont été marquées comme des clés d'entité (que je suppose que la combinaison de faire un ID unique pour un enregistrement).

Dans mes requêtes ces trois colonnes étaient toutes les mêmes. Je suppose que le cadre d'entité flippé et juste placé le premier enregistrement dans tous les enregistrements suivants jusqu'à ce que l'une de ces colonnes a changé (donc un nouvel "ensemble" unique). Maintenant que je l'ai compris, j'ai regardé l'endroit où cette information a été utilisée pour la première fois et j'ai vu qu'une instruction de regroupement était appliquée en premier (les données sont interrogées via une procédure stockée à un autre endroit dans l'application).). Le groupe a écrasé l'une des colonnes de clé d'entité de telle sorte qu'elle était toujours unique. Cela provoque des résultats dans cet emplacement pour apparaître correctement.

Ma solution consiste à ajouter une nouvelle colonne à cette vue qui projette juste un GUID (en utilisant NEWID() dans SQL). Le problème est que je ne sais pas comment dire à EDMX d'utiliser cette propriété nouvellement ajoutée comme seule clé d'entité pour la vue mappée!

-J'ai fermé ce correctif comme je sais quel est le problème et posera mon autre question dans une nouvelle question. Merci pour tous les commentaires pour ceux qui ont pris le temps de répondre!

+1

Pourriez-vous vous connecter à l'autre question? – defines

+0

plz laissez-nous savoir comment avez-vous mis cela comme un PK dans la vue ou dans edmx –

+0

Hey les gars, je voudrais avoir encore accès à cette base de code. Je n'ai pas quitté cette position plus longtemps après avoir posté cette question/réponse. Ça fait un moment que je dois faire quelque chose comme ça dans EF. Ce serait trivial dans l'API fluide. Si je peux me rappeler correctement, j'ai supprimé toutes les clés individuelles pour ne faire aucune clé composite dans le mappage, mais à la place utilisé le guid créé dans la vue comme le PK. –

0

Avez-vous essayé ce type de syntaxe? Ne peut pas imaginer que c'est la cause, mais qui sait ...

using (var dc = new OmsEntityContext()) 
{ 
    var la = (from p in dc.Position 
    where p.AccountNumber = "12345678" 
    select p).ToList(); 
} 

et

using (var dc = new OmsEntityContext()) 
{ 
    var deDa = (from p in dc.Position 
    where p.AccountNumber = "12345678" 
    select new {p.AccountNumber, p.SecurityNumber, p.CUSIP}).ToList(); 
} 

</longShot> 
Questions connexes