【问题标题】:Cast IEnumerable<Inherited> To IEnumerable<Base>将 IEnumerable<Inherited> 强制转换为 IEnumerable<Base>
【发布时间】:2013-11-01 20:19:05
【问题描述】:

我正在尝试将继承类型的 IEnumerable 强制转换为基类的 IEnumerable

试过以下:

var test = resultFromDb.Cast<BookedResource>();

return test.ToList();

但出现错误:

您无法转换这些类型。 Linq to Entities 仅支持转换原始 EDM 类型。

所涉及的类如下所示:

public partial class HistoryBookedResource : BookedResource
{
}

public partial class HistoryBookedResource
{
    public int ResourceId { get; set; }
    public string DateFrom { get; set; }
    public string TimeFrom { get; set; }
    public string TimeTo { get; set; }
}

public partial class BookedResource
{
    public int ResourceId { get; set; }
    public string DateFrom { get; set; }
    public string TimeFrom { get; set; }
    public string TimeTo { get; set; }
}

[MetadataType(typeof(BookedResourceMetaData))]
public partial class BookedResource
{
}

public class BookedResourceMetaData
{
    [Required(ErrorMessage = "Resource id is Required")]
    [Range(0, int.MaxValue, ErrorMessage = "Resource id is must be an number")]
    public object ResourceId { get; set; }

    [Required(ErrorMessage = "Date is Required")]
    public object DateFrom { get; set; }

    [Required(ErrorMessage = "Time From is Required")]
    public object TimeFrom { get; set; }

    [Required(ErrorMessage = "Time to is Required")]
    public object TimeTo { get; set; }
}

我要解决的问题是使用实体框架和 LINQ 从表 HistoryBookedResource 中获取记录并在 IEnumerable&lt;BookedResource&gt; 中获取结果。

更新:

当使用以下铸造接缝工作但尝试使用 foreach 循环时,数据会丢失。

resultFromDb.ToList() as IEnumerable<BookedResource>;

更新 2:

我使用实体框架生成的模型,模型(edmx)是从数据库创建的,edmx 包括代表数据库表的类。

在数据库中,我有一个旧 BookedResource 的历史表,用户可能想查看这些并从数据库实体框架中获取旧数据,使用与表同名的类从 db 接收数据.所以我从 HistoryBookedResource 类中的表 HistoryBookedResource 接收数据。

因为实体框架生成的部分类具有我不知道是否可以使它们成为虚拟和覆盖的属性。

任何建议将不胜感激。

【问题讨论】:

  • 有两个完全相同的类BookedResourceHistoryBookedResource有什么意义?
  • 您正在隐藏资源,因此在执行转换后,您将无法再读取数据。 (另外你不是从IEnumerable&lt;Inherited&gt;IEnumerable&lt;Base&gt; 你是从IQueryable&lt;Inherited&gt;IQueryable&lt;Base&gt;
  • 没错,数据消失了,但首先当我在 foreach 中使用它时。您能否详细说明“阴影”的含义,以及为什么它是 IQueryable 而不是 IEnumerable?
  • 您在父项中声明与子项相同的属性,而没有使用关键字override,这会导致shadowing。要修复每个属性必须在父级中标记为virtual,而在子级中的每个属性必须标记为override。另外看看你得到的错误我愿意打赌resultFromDbIQueryable&lt;BookedResource&gt;,这就是我的意思。你能解释一下为什么BookedResourceHistoryBookedResource 有相同的属性吗? HistoryBookedResource 应该是某种 DTO 吗?
  • 看更新,期待评论

标签: c# asp.net-mvc linq entity-framework


【解决方案1】:

在这种情况下,您通常使用AsEnumerable&lt;T&gt;

var test = resultFromDb.AsEnumerable().Cast<BookedResource>();

这样做的好处是不会一次枚举整个结果(你不会失去懒惰)。

【讨论】:

    【解决方案2】:

    尝试:

    resultFromDb.AsEnumerable().Cast<BookedResource>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多