2009-08-20 8 views
0

J'ai le code ci-dessous pour tenter de permettre à l'utilisateur de "parcourir" les notes de cas dans la base de données en cliquant sur Suivant ou Précédent sur le formulaire WinForm. Il saisira uniquement la première note de cas. Qu'est-ce que je fais de mal?Implémentation de Next/Previous avec LINQ to SQL

Il ya eu de nombreuses modifications à ce poste, je suis désolé, mais en suivant les conseils de Jon Skeet, j'ai été en mesure de "réparer" ce qui était à l'origine faux, mais cela ne fonctionne toujours pas. Dois-je restructurer ma requête pour prendre en compte la note actuelle?

Si oui, comment je fais ça?

public static Guid NextCaseNoteID (int personID) 
    { 
     var context = new MatrixDataContext(); 

     Guid nextNoteID = (from caseNote in context.tblCaseNotes 
                where caseNote.PersonID == personID 
                orderby caseNote.InsertDate 
                select caseNote.CaseNoteID).Skip(1).FirstOrDefault(); 

     return nextNoteID; 
    } 


C'est ce que j'ai fini avec, grâce à tout le monde qui a posté et a suivi mon train mal pensée de la pensée ...

Il semble bien fonctionner si je suis maintenant en essayant de prouver si j'ai besoin du Skip (1) encore .... Merci !!

pour référence future

 public static Guid NextCaseNoteID (int personID, DateTime? insertDate) 
    { 
     var context = new MatrixDataContext(); 

     Guid nextNoteID = (from caseNote in context.tblCaseNotes 
                where caseNote.PersonID == personID && caseNote.InsertDate > insertDate 
                orderby caseNote.InsertDate 
                select caseNote.CaseNoteID).Skip(1).FirstOrDefault(); 

     return nextNoteID; 
    } 

    public static Guid PreviousCaseNoteID(int personID, DateTime? insertDate) 
    { 
     var context = new MatrixDataContext(); 

     Guid nextNoteID = (from caseNote in context.tblCaseNotes 
          where caseNote.PersonID == personID && caseNote.InsertDate < insertDate 
          orderby caseNote.InsertDate 
          select caseNote.CaseNoteID).Skip(1).FirstOrDefault(); 

     return nextNoteID; 
    } 
+0

pourquoi renvoyez-vous iquerayble au lieu de seulement le guid? – Geoff

+0

@Geoff: Resharper m'a dit et je ne (ne) savais pas mieux. Voir mon commentaire sous le message de Jon Skeet. –

+0

En fonction de votre modification, pouvez-vous confirmer que ce qui est retourné par caseNote.CaseNoteID est en fait 32 chiffres avec 4 tirets? – Geoff

Répondre

2

Eh bien, le problème le plus évident est que vous créez une instance d'un type anonyme. Essayez ceci:

public static IQueryable<Guid> NextCaseNoteID (int personID) 
{ 
    var context = new MatrixDataContext(); 

    IQueryable<Guid> nextNoteID = (from caseNote in context.tblCaseNotes 
            where caseNote.PersonID == personID 
            orderby caseNote.InsertDate 
            select caseNote.CaseNoteID).Skip(1).Take(1); 

    return nextNoteID; 
} 

Je ne suis pas du tout sûr que c'est vraiment ce que vous êtes après, mais il est probable au moins compiler ...

Êtes-vous sûr que vous ne voulez pas revenir le réel GUID au lieu d'un IQueryable<Guid>?

Vous pouvez appeler FirstOrDefault() au lieu de Take(1) ...

EDIT: D'accord, donc il ne retourner un GUID ... vous dites cela ne fonctionne pas, mais pas comment cela ne fonctionne pas. Si vous voulez aller chercher la prochaine note de cas, vous devriez probablement passer l'ID de note de cas plutôt que l'ID de personne, mais ce n'est pas très clair ...

+0

Non, je veux le guid réel, mais j'avais le même type de problèmes et je ne voulais pas bombarder mon poste avec mes nombreuses tentatives ratées à ce sujet. Je crois que c'est ce que Joel Splosky a conseillé, de toute façon. Que ferait FirstOrDefault() autant que mes tentatives et itération à travers .... Merci –

+0

En fait, je viens de réaliser que l'utilisation de Guid est ce que j'ai essayé au début, mais il ne compilerait pas et 'intelisense' (ReSharper ??) suggéré Je change le type de noteID en IQueryable .... –

+0

'FirstOrDefault' va exécuter la requête et retourner le premier résultat * ou * la valeur par défaut pour le type (ie' default (Guid) 'dans ce cas). –

0

Je pourrais avoir l'air d'un idiot. Mais, pourquoi ne pouvez-vous pas utiliser un lecteur de données pour faire cette chose (en particulier lorsque vous utilisez linq to sql, qui appelle à son tour SQL Server pour ce faire)? Faites-moi savoir, si j'ai totalement mal compris le problème.

1

Si vous voulez une méthode suivante/précédente, ne devriez-vous pas informer quelle est la position actuelle? Puis en sautant currentPosition + 1 pour nextPosition et currentPosition - 1.

J'utilise habituellement Single() au lieu de FirstOrDefault(). Mais je pense que cela ne fera aucune différence.