2009-11-17 19 views
2

J'accède à un objet de contexte de données généré automatiquement à l'aide de LINQ to SQL. La base de données SQL est une zone SQL Server 2000. La classe avec laquelle je travaille est une vue SQL. J'ai une déclaration qui ressemble à ceci:LINQ, Ignorer, OrderBy et SQL Server 2000

query = _context.OrderDetails 
    .Where(w => w.Product == "TEST") 
    .OrderBy(o => o.DateCompleted) 
    .ThenBy(t => t.LineItemId) 
    .Skip(startRowIndex) 
    .Take(maximumRows); 

Cependant, lorsque la valeur de saut est tout sauf 0, je reçois cette erreur:

Ce fournisseur prend en charge Skip() que sur ordonné requêtes retour des entités ou des projections qui contiennent toutes les colonnes d'identité, où la requête est une requête à table unique (non jointe) ou est une opération Distinct, Except, Intersect ou Union (non Concat).

Je pense que entre le DateCompleted et LineItemId que les lignes seraient uniques, mais là encore cela apparaît. Cela a-t-il à voir avec ce point de vue? Si oui, comment puis-je contourner ce problème?

Répondre

2

Je crois que ce que cela signifie est que si vous n'avez pas une colonne d'identité sur la table OrderDetails, vous devez ajouter .Distinct() ou un des autres opérateurs mentionnés.

+0

Je pense que cela a fonctionné. Pas sûr cependant. Bonne suggestion! –

+0

Cela a fonctionné. Nice "hack" pour forcer Distinct() sur la requête LINQ. –

4

SQL Server 2000 a quelques «plomberie» manquantes que Linq doit contourner pour pouvoir effectuer des fonctions de saut et de prise. Assurez-vous que vous incluez la colonne Identité dans _context.OrderDetails et que vous remplissez toutes les autres conditions indiquées dans le message d'erreur.

Bien sûr, vous pouvez toujours effectuer une mise à niveau vers SQL Server 2005 ou une version ultérieure. :)

Plus d'informations ici: http://msdn.microsoft.com/en-us/library/bb386988.aspx

+0

J'aimerais que l'erreur soit un peu plus descriptive quant au problème réel. Je vais devoir plonger un peu plus. –

+1

Cette séparation de 2000 à> 2005 m'a jeté. Je développais/testais sur 2008 R2 sur mon serveur local et de test, mais je le déployais sur une instance 2000 pour la production. Comme ma présence sur ce fil indique, tout a bien fonctionné sur mon local, mais la même fonctionnalité était DOA après le déploiement. Dans mon cas, l'ajout d'un PK à l'ID sur mon objet (dans le DBML) a résolu le problème - heureusement, aucun changement à "mon code" n'était nécessaire. – mattezell