2011-03-16 3 views
0

J'ai la requête suivante:Erreur: méthode « d'abord » ne peut être utilisé comme une opération de requête finale

 Dim roommates = From p In dbroom.Residents _ 
        Where p.room = queryStudent.First.r.id _ 
        Where p.building = queryStudent.First.b.id _ 
        Where p.year = year _ 
        Where p.semester = term _ 
        Select p.person_name 

Il retourne actuellement aucun résultat. Je recevais une erreur lors d'une tentative de lier ce ResultSet (car il était vide) à un répéteur dans ASP.NET, donc je tenté de lui échapper:

If roommates.Count() = 0 Then 
     Dim nomates As String = "No current roommates." 
     rptrRoommates.DataSource = nomates 
     rptrRoommates.DataBind() 
    Else 
     rptrRoommates.DataSource = roommates 
     rptrRoommates.DataBind() 
    End If 

Mais je reçois toujours la même erreur:

The method 'First' can only be used as a final query operation. Consider using the method 'FirstOrDefault' in this instance instead.

+2

Le message d'erreur vous donne une suggestion. L'as tu essayé? –

+0

Je ne suis pas sûr de savoir comment implémenter la suggestion dans cette instance de code? J'essaie d'obtenir chaque enregistrement à tour de rôle, pas seulement le premier enregistrement. – davemackey

+1

Pour implémenter la suggestion, vous devez remplacer 'First' par' FirstOrDefault'. Quel est exactement votre 'queryStudent'? Cela pourrait aider si vous postez le code qui s'y rapporte. – Yakimych

Répondre

2

Vous ne pouvez pas utiliser la sous-requête de cette manière. Exécutez séparément les sous-requêtes et n'utilisez que les identifiants reçus dans la requête principale ou réécrivez la requête pour utiliser les jointures.

+0

Que voulez-vous dire par sous-requêtes? Où je référence queryStudent? Ou le fait que j'ai plusieurs clauses Where? – davemackey

+0

Je veux dire queryStudent. –

3

Dans une requête LINQ to Entities, vous pouvez utiliser FirstOrDefault() ou SingleOrDefault comme dernière opération de requête.

var right = Context.Foos 
         .Where(f => f.SomeBoolean) 
         .FirstOrDefault();  // works 
    var works = Context.Foos 
         .Where(f => f.SomeBoolean) 
         .SingleOrDefault();  // works 

Cependant, à l'intérieur de la requête, vous ne pouvez pas utiliser SingleOrDefault:

var wrong = Context.Foos 
        .Where(f => f.SomeBoolean) 
        .Select(f => f.Bars.SingleOrDefault()) 
        .SingleOrDefault();   // Runtime error 
var right = Context.Foos 
        .Where(f => f.SomeBoolean) 
        .Select(f => f.Bars.FirstOrDefault()) 
        .SingleOrDefault();   // works 

Notez que la SingleOrDefault finale est toujours OK, mais nous avons dû changer l'une à l'intérieur de la requête à FirstOrDefault. La raison en est que SingleOrDefault est implémenté. Il indique au serveur de base de données de renvoyer les deux premiers enregistrements, puis déclenche une exception si plusieurs sont renvoyés. La requête LINQ to Entities - tout jusqu'à la SingleOrDefault finale - sera convertie en SQL. Ce comportement d'erreur n'est pas simple à exprimer dans une requête SQL pure.

Ref: here

Questions connexes