将 IEnumerable<Inherited> 转换为 IEnumerable<Base>

Mik*_*234 3 c# linq asp.net-mvc entity-framework

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

曾尝试以下:

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

return test.ToList();
Run Code Online (Sandbox Code Playgroud)

但得到错误:

您不能转换这些类型。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; }
}
Run Code Online (Sandbox Code Playgroud)

我试图解决的问题是从表中获取记录HistoryBookedResource并在IEnumerable<BookedResource>使用实体框架和 LINQ 时得到结果。

更新:

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

resultFromDb.ToList() as IEnumerable<BookedResource>;
Run Code Online (Sandbox Code Playgroud)

更新 2:

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

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

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

任何建议将不胜感激。

Bar*_*zKP 6

通常你AsEnumerable<T>在这种情况下使用:

var test = resultFromDb.AsEnumerable().Cast<BookedResource>();
Run Code Online (Sandbox Code Playgroud)

这具有不立即枚举整个结果的优点(您不会放松懒惰)。