J'utilise Entity Framework qui contient la vue. Et j'ai une requête:
var data = this.context.vwRevenues
.Where(x => x.revenue >= 0);
.OrderByDescending(x => x.year)
.ThenByDescending(x => x.month)
.Take(10)
.ToList();
Cette requête renvoie un ensemble d'entités, mais la 1ère entité est égale à la 5ème.
data[0] == data[4] // true
Je prends le script sql pour cette requête depuis sql tracer et l'exécute dans SQL Management Studio, il renvoie différents enregistrements.
Selon @ Giovane Réponses
Nous avons eu le même problème dans notre système avec Entity Framework traitant des vues. Essayez d'utiliser ROW_NUMBER () OVER () SQL pour créer une colonne avec des valeurs uniques, mais cela n'a pas fonctionné.
J'ai fait la même chose, mais pour le faire fonctionner, j'ai besoin d'ouvrir le modèle EDMX, puis de sélectionner une colonne comme clé d'entité.
Ensuite, cela fonctionnera
Il y a un très bon article à ce sujet
La ligne d'articles la plus importante est:
Lorsque vous incluez une vue dans votre modèle d'entité, le modèle semble simplement utiliser les premières colonnes non nulles comme clé primaire (car toutes les colonnes utilisées dans la clé primaire doivent être non nullable).
Il vous suffit de faire: context.viewname.AsNoTracking().Where(x => x.ColumnName != null);
Nous avons eu le même problème dans notre système avec Entity Framework traitant des vues. Essayez d'utiliser ROW_NUMBER () OVER () SQL pour créer une colonne avec des valeurs uniques, mais cela n'a pas fonctionné.
Nous devons insérer un champ de plus, un FK pour une autre table dans la vue afin qu'il puisse ajouter comme formation supplémentaire pour mebro EntityKeyMembers Elimite et donc le problème de répétition.
Ainsi, si le problème persiste dans ce type de situation, la solution est d'insérer une colonne FK pour qu'elle soit MEMBRES des champs qui forment l'EntityKey de la table.
Dans la vue, essayez de convertir le premier enregistrement en une valeur non nulle, comme ceci:
isnull(ROW_NUMBER() OVER (ORDER BY "Column"), 0) AS Row
Il indique à Entity Framework qui peut être automatiquement la clé primaire.
Si vous ne souhaitez pas mettre à jour edmx et définir une clé sur la colonne &&
si vous ne souhaitez pas mettre à jour l'enregistrement de vue (uniquement pour obtenir l'enregistrement), utilisez le code ci-dessous pour que cela fonctionne.
context.viewname.MergeOption = System.Data.Objects.MergeOption.NoTracking;
context.viewname.Where(x => x.columnname != null);