2009-04-18 6 views
0

im using linq to sql J'ai une entité de mission, qui détient une collection d'affectations. disons que je suis allé interroger la durée totale de toutes les missions par mission.ne comprend pas cette exception

et j'ai écrit la requête suivante:

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

durée est simplement définie comme (pour faire simple)

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

exécution de ce code me donne l'exception suivante:

Une seule expression peut être spécifiée dans la liste de sélection lorsque la sous-requête n'est pas présenté avec EXISTS.
Description: Une exception non gérée s'est produite lors de l'exécution de la requête Web actuelle . S'il vous plaît examiner le pile trace pour plus d'informations sur l'erreur et d'où il provient dans le code .

Détails de l'exception: System.Data.SqlClient.SqlException: Une seule expression peut être spécifiée dans la liste de sélection lorsque la sous-requête ne sont pas introduites par exists.

j'ai remarqué que si je laisse de côté la durée() de la requête (alias

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

cela fonctionne OK
des idées sur la cause de cela?

Répondre

0

La propriété Durée n'est pas exprimable dans une instruction SQL car il ne s'agit pas d'une propriété de table Comme il s'agit d'une méthode sur Assignments, l'analyseur d'expression ne peut pas la transformer correctement en une expression SQL valide. être calculé. Essayez d'utiliser la même expression que vous utilisez pour calculer Duration dans votre expression Select.

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

Vous pouvez finaliser la requête puis faire les sélectionner à l'aide LINQToObjects qui travailleront avec des propriétés non colonnaires/méthodes. Puisque vous ne filtrez pas les missions dans cette requête, je pense que j'irais avec cette méthode.

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