为什么我不能使用`TimeSpan.FromMinutes`在RIA上投射`TimeSpan`?

时间:2012-01-12 18:43:29

标签: entity-framework linq-to-sql silverlight-4.0 wcf-ria-services

我已使用POCO将RIA服务与实体框架相结合。这一切都运行得非常好(比LINQ to SQL更好)。我遇到的问题是以下代码段:

[Query]
public IQueryable<MyEntity> GetMyEntities()
{
    return from myEntity in ObjectContext.MyEntities
           where myEntity.Status != "deleted"
           select new MyEntity
           {
               // Other property assignments...

               SuchAndSuchTime = TimeSpan.FromMinutes(project.SuchAndSuchTime ?? 0.0),

               // Other property assignments...
           };
}

这是我的代码版本,其名称已被更改以保护无辜者。这会编译find,但是当我运行它时会出现以下异常:

  

查询'GetMyEntities'的加载操作失败。 LINQ to Entities可以   无法识别方法'System.TimeSpan FromMinutes(Double)'方法,   并且此方法无法转换为商店表达式。

为什么我不能这样做,是否有解决方法?

2 个答案:

答案 0 :(得分:4)

这里的问题是CLR TimeSpan类在LINQ to Entities中没有完整的规范映射。这是您的异常在“......中无法转换为商店表达式......”的条款中引用的。

对于LINQ场景,针对实体框架的查询涉及通过规范函数将某些CLR方法映射到基础数据源上的方法。 LINQ to Entities查询中未显式映射到规范函数的任何方法调用都将导致抛出运行时NotSupportedException异常。

来源:MSDN

TimeSpan就是其中之一。

至少有两种解决方案,这些是......

  1. 使用有效的LINQ to SQL(即仅限规范方法)语句从数据库中获取完整的结果集;然后使用LINQ to Objects过滤返回的结果。 LINQ to Objects过滤器应包含所有非规范方法,以便您的过滤提供预期的数据子集。

  2. 将非规范方法撤出到存储过程(即转换为直接SQL)并调用存储过程。

  3. 第三种解决方案是尝试将非规范表达式包装到域服务类中的私有方法中。这是我在触及这个难以捉摸的例外之前所做的。

    给出了第四种更加模糊的方法here

答案 1 :(得分:1)

我认为这可以在EF 4.2中修复,但我不认为它是公开发布的。

但底线是加里是正确的。