Entity Framework retour distinctes enregistrements problème
J'ai un PC Enity qui ont certaines Propriétés , je voudrais revenir une liste d'Objets distincts (PC ou d'un Type Complexe ou quoi que ce soit ) basé sur une propriété afin de la lier à des contrôles serveur comme DropDownList . Et Parce que ma méthode situé dans BLL je ne peux pas rendre anonyme de type , j'ai Donc créé une Branche ComplexType qui a deux peroperties.
Je l'ai écrit comme ça, mais il ont repeative dossiers:
List<Branch> result = ( from p in _context.PCs
where p.UserId== userId
select new Branch()
{
BranchId= p.BranchId,
BranchName=p.BranchName
}).Distinct().ToList();
Edit :
Merci à vous tous , Cela a fonctionné :
List<PC> result = _context.PCs
.GroupBy(p=>p.BranchName , p.BranchId})
.select(g=>g.First())
.ToList();
Voulez-vous dire que vous avez deux éléments dans le
Oui, Vous l'obtenez à droite
Ne vous utilisez SQL Server? Si oui, quelle version? Si non, quelle base de données?
SQL Server 2008
C'est étrange. Je viens de tester votre requête et ça marche pour moi, voir ma réponse ci-dessous. De toute façon, vous avez déjà une autre solution de travail...
result
liste qui sont les mêmes dans les deux BranchId
ET BranchName
? Ce serait surprenant, car cela ne devrait pas arriver avec votre exemple.Oui, Vous l'obtenez à droite
Ne vous utilisez SQL Server? Si oui, quelle version? Si non, quelle base de données?
SQL Server 2008
C'est étrange. Je viens de tester votre requête et ça marche pour moi, voir ma réponse ci-dessous. De toute façon, vous avez déjà une autre solution de travail...
OriginalL'auteur Mostafa | 2012-04-02
Vous devez vous connecter pour publier un commentaire.
ce sera le retour des lignes distinctes pour toutes les colonnes dans l'instruction select. Si vous voulez les différentes lignes d'une colonne particulière il suffit de spécifier que la colonne particulière
Si vous souhaitez obtenir des valeurs distinctes, basées sur plusieurs colonnes, vous devez créer un groupe, puis choisissez d'abord la valeur de ce groupe. Dans ce cas, vous n'utiliserez pas Distincts, par exemple
remplacer BranchId, avec BranchName en premier statemet
La deuxième n'a pas marché non plus . C'obtenir le temps de compilation d'erreur : Impossible de convertir le type de Source du Système.Collection.Génériques.Liste<...Pc> le type de cible du Système.Collection.Génériques.Liste<...Branch>
essayer aussi , Mais il ont repeative dossiers de trop
il suffit de modifier la deuxième déclaration, j'ai oublié de spécifier Branche sélectionnez nouvelle déclaration, essayez-le maintenant
OriginalL'auteur Habib
Je ne peux pas reproduire le problème (testé avec SQL Server 2008 R2 et EF 4.1/DbContext). La requête dans votre question...
... génère le code SQL suivant:
C'est un DISTINCT sur les deux colonnes, et j'ai l'attend distinctes résultat - pas de doublons dans
BranchId
etBranchName
.OriginalL'auteur Slauma
Vous retrouver avec des doublons parce que Distinct() est incapable de reconnaître deux de votre complexe de la Branche des objets identiques à partir de leurs propriétés. Il suffit de comparer pour objet l'égalité, qui sera de retour faux (parce que vous créez deux objets différents, mais avec les mêmes valeurs).
Vous pouvez utiliser Distinctes(IQueryable, IEqualityComparer) fournir votre propre Comparer ou de mettre en œuvre la IEquatable Interface.
Distinct
deIQueryable<T>
), pas de LINQ to Objects (Distinct
deIEnumerable<T>
). L'objet de comparaison d'égalité ne s'applique pas dans ce cas.Vous avez raison, bon appel. Mauvais Distinct() ici. Mais ne serait pas fournir une IEqualityComparer toujours résoudre son problème?
Non, car la surcharge de
Distinct
qui prend laIEqualityComparer
n'est pas pris en charge dans LINQ to entities. En fait, je suis très confus pourquoi l'exemple en question ne fonctionne pas. Je vais le tester...OriginalL'auteur magnattic
Cela fonctionne pour moi.
1.
2.
3.
OriginalL'auteur Joma