不明白这个例外

时间:2009-04-18 14:36:21

标签: asp.net linq-to-sql

即时通讯使用linq to sql 我有一个Mission实体,它拥有一系列作业。让我说我去查询每次任务的所有任务的总持续时间。

我写了以下查询:

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   描述:未处理的异常   在执行期间发生   当前的网络请求。请查看   堆栈跟踪以获取更多信息   错误及其来源   代码。

     

异常详细信息:   System.Data.SqlClient.SqlException:   只能指定一个表达式   在子查询中的选择列表中   没有引入EXISTS。

我注意到如果我从查询中省略了Duration()(又名

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

它运作正常 关于这个原因的任何想法?

1 个答案:

答案 0 :(得分:0)

Duration语句在SQL语句中不可表达,因为它不是表属性。由于它是Assignments上的方法,因此表达式解析器无法将其正确地转换为有效的SQL表达式。据推测,Assignments表中有一些列将从中计算持续时间。尝试使用您在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())
    });