【问题标题】:Why can't I project a `TimeSpan` across RIA using `TimeSpan.FromMinutes`?为什么我不能使用“TimeSpan.FromMinutes”跨 RIA 投影“TimeSpan”?
【发布时间】:2012-01-12 18:43:28
【问题描述】:

我使用 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 Entity 可以 无法识别方法 'System.TimeSpan FromMinutes(Double)' 方法, 而且这个方法不能翻译成store表达式。

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

【问题讨论】:

  • 如果必须,我会默认接受这个,但我真的很想坚持一个更好的答案。谢谢:)

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


【解决方案1】:

这里的问题是 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)并调用存储过程。

第三种解决方案是尝试将非规范表达式包装到域服务类中的私有方法中。这是我在深入了解这个难以捉摸的异常之前所做的事情。

here 给出了第四个更晦涩的方法

【讨论】:

    【解决方案2】:

    我认为这可能会在 EF 4.2 中得到修复,但我认为它不会公开发布。

    但归根结底,Garry 是正确的。

    【讨论】:

      猜你喜欢
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多