【问题标题】:EF6: materializing data using custom typeEF6:使用自定义类型实现数据
【发布时间】:2018-01-24 21:55:34
【问题描述】:

假设我有一个实体:

public class Event
{
    ...
    public DateTime At { get; set; }
}

还有一个模型对象:

public class Something
{
    ...
    public Date At { get; set; }
}

其中 Date 是可以从 DateTime 隐式转换的自定义类型:

public struct Date
{
    public Date(DateTime value)
    {
        ...
    }
    ...
    public static implicit operator Date(DateTime value)
    {
        return new Date(value);
    }
}

我要做的是从数据库中获取数据到模型中:

var events = db.Events
    .Select(x => new Something
    {
        ...
        At = x.At,
    })
    .ToList();

当然这是失败的,但有以下例外:

无法将类型“System.DateTime”转换为类型“SMG.Web.Date”。 LINQ to Entities 仅支持转换 EDM 基元或枚举类型。

是的,我知道我可以在一些临时对象的帮助下实现我所需要的,将 DateTime 值具体化到内存中,然后将其转换为我的自定义类型。但是,如果我不想使用这种策略,而是想一步到位,该怎么办。

问题是:有没有办法教 LINQ to Entities 如何在现实的那一侧处理我的自定义日期?

【问题讨论】:

  • Select(...)之前做ToList()
  • 你真的读了吗?
  • 是的,这就是我评论而不是回答的原因。
  • 是的,使用 ToList() 强制数据实现并在此之后将其转换为自定义类型 - 会有所帮助 - 我知道。但问题不在于“简单的方法”。我想知道是否可以使用我的类型而不是原语来做到这一点。

标签: entity-framework linq


【解决方案1】:

你的演员是错误的方式。改写为:

public struct Date
{
    public Date(DateTime value)
    {
        DateTimeValue = value;
    }

    // Or whatever your field or property is called
    public DateTime DateTimeValue { get; }

    public static implicit operator DateTime(Date date)
    {
        return date.DateTimeValue;
    }
}

那么 EF 应该让你在表达式中使用它。这种方法不适用于代码优先的 EF。

【讨论】:

  • 你真的在 LINQ-to-Entities 查询中尝试过这个吗?
  • 类似的东西。诚然,我使用 LINQPad 对其进行了测试,但它使用 EF 6.1.3 生成了正确的 SQL。
  • 我本以为 EF 会抛出异常,因为它不知道 Date 的类型:它不是映射类型,也不在其已知类型映射的集合中。显然,它只是尝试将 DateTime 分配给映射到数据库中 DateTime 列的任何属性,并且当接受属性成功“吞下”DateTime 值时,它就成功了。当然,这在代码优先中是行不通的,因为 EF 甚至无法从一开始就从未知类型创建数据库列。
猜你喜欢
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 2022-12-14
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
相关资源
最近更新 更多