2009-04-18 16 views
0

Im mit Linq zu SQL Ich habe eine Mission-Entität, die eine Sammlung von Zuweisungen enthält. Nehmen wir an, ich wollte die Gesamtdauer aller Aufträge pro Mission abfragen.nicht verstehen, diese Ausnahme

und ich habe die folgende Abfrage geschrieben:

return db.Missions.Select(m => new MissionNameDays() 
    { 
     Name = m.MissionName, 
     Days = m.Assignments.Sum(a => a.Duration()) 
    }); 

Dauer einfach definiert ist (es einfach zu halten)

public partial class Assignment 
{ 
    public int Duration() 
    { 
     return 1; 
    } 
} 

diesen Code ausgeführt wird, gibt mir die folgende Ausnahme:

Nur ein Ausdruck kann in der Auswahlliste angegeben werden, wenn die Unterabfrage wird nicht mit EXISTS eingeführt.
Beschreibung: Bei der Ausführung der aktuellen Webanforderung ist eine nicht behandelte Ausnahme aufgetreten. Bitte überprüfen Sie die Stack-Trace für weitere Informationen über den Fehler und wo es in der Code stammt.

Ausnahmedetails: System.Data.SqlClient.SqlException: nur ein Ausdruck in der Auswahlliste angegeben werden kann, wenn die Unterabfrage nicht mit EXISTS eingeführt.

Ich habe bemerkt, dass, wenn ich die Dauer() aus der Abfrage (aka

Days = m.Assignments.Sum(a => 1) 

es funktioniert OK
keine Vorstellungen über die Ursache dafür?

Antwort

0

Die Eigenschaft Dauer auslassen ist in einer SQL-Anweisung nicht ausdrückbar, da es keine Tabelleneigenschaft ist.Da es sich um eine Methode für Zuweisungen handelt, kann der Ausdrucksparser sie nicht korrekt in einen gültigen SQL-Ausdruck umwandeln.Vielleicht gibt es in der Zuordnungstabelle eine Spalte, aus der sich die Dauer ergibt berechnet werden derselbe Ausdruck, den Sie zum Berechnen der Dauer in Ihrem Select-Ausdruck verwenden.

return db.Missions.Select(m => new MissionNameDays() 
    { 
     Name = m.MissionName, 
     Days = m.Assignments.Sum(a => a.LengthInMinutes/1440) 
    }); 

Alternativ können Sie die Abfrage dann tun, um die Auswahl mit LINQToObjects finalisieren, die mit nicht-säulen Eigenschaften/Methoden arbeiten. Da Sie die Missionen in dieser Abfrage nicht filtern, denke ich, dass ich mit dieser Methode gehen würde.

return db.Missions.ToList().Select(m => new MissionNameDays() 
    { 
     Name = m.MissionName, 
     Days = m.Assignments.Sum(a => a.Duration()) 
    }); 
Verwandte Themen