2009-04-18 56 views
0

即时通讯使用LINQ到SQL 我有一个任务实体,它包含一组任务。让我说我去查询每个任务的所有任务的总持续时间。不理解这个异常

,我已经写了下面的查询:

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

持续时间被简单地定义为(保持简单)

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

运行此代码给了我以下异常:

当子查询只有一个表达式可以在选择列表中指定不与EXISTS一起引入。
描述:在执行 当前Web请求期间发生未处理的异常 。请查看 堆栈跟踪以了解有关 错误的更多信息,以及它源自 的代码。

异常详细信息: System.Data.SqlClient.SqlException: 只有一个表达式可以在选择列表中指定 当不引入子查询 与存在。

我发现,如果我忽略持续时间()从查询(又名

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

它的工作原理有关的这个事业OK
什么想法?

回答

0

Duration属性在SQL语句中不能表达,因为它是Assignments上的一个方法,所以表达式解析器不能正确地将它变成一个有效的SQL表达式。假设在Assignments表中有一些从哪个Duration开始被计算,尝试使用与您在Select表达式中用于计算持续时间的表达式相同。

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

或者,您可以最终确定查询,然后使用LINQToObjects进行选择,该选择将使用非列状属性/方法。既然你没有在这个查询中过滤任务,我想我会用这个方法。

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