即时通讯使用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)
它运作正常 关于这个原因的任何想法?
答案 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())
});