gpt4 book ai didi

c# - Cast() 异常 : LINQ to Entities only supports casting EDM primitive or enumeration types

转载 作者:太空宇宙 更新时间:2023-11-03 20:09:41 31 4
gpt4 key购买 nike

我想在我编写的通用 MVC View 中显示一些名为 CriminalEvent 的实体。 View 要求传递给它的模型应实现 IDataModel 接口(interface)。现在,CriminalEvent 具有实现此接口(interface)的属性,但名称不同,我无法更改它。

所以在我的代码中,我继承了 CriminalEvent 并且我的派生类(也称为 CriminalEvent,我猜很愚蠢,但允许我避免许多代码更改......)具有显式接口(interface)代码:

Using ViewApp;
public interface IDataModel
{
int ID { get; set; }
int CriminalEventID { get; set; }
}

public class ViewCriminalEvent : AIM.Police.DB.CriminalEvent, IDataModel
{
int IDataModel.ID
{
get { return CriminalEventID; }
set { CriminalEventID = value; }
}
}

(我知道,在这种情况下接口(interface)的 ID 属性等于 CriminalEventID,没关系)

我希望能够读取 AIM.Police.DB.CriminalEvent 实体并通过 Linq to Entities Cast()ing 将它们填充到派生的 CriminalEvent,像这样:

View 模型(我需要填充 CriminalEvents 属性):

Using ViewApp;
public class CriminalEventMainViewModel
{
public IEnumerable<IDataModel> CriminalEvents { get; set; }
public IDataModel SelectedEntity { get; set; }

public string SubEntityDisplayName { get; set; }

public IEnumerable<IDataModel> SubEntityCollection { get; set; }
public IDataModel SelectedSubEntity { get; set; }
}

和 Controller 代码:

Using ViewApp;    
private ViewResult CriminalEventIndexView(CriminalEvent selectedCriminalEvent = null)
{
CriminalEventMainViewModel viewModel =
new CriminalEventMainViewModel();

using (var db1 = new AIM.Police.DB.InvestigationContext(lazyLoadingEnabled: false))
{
viewModel.CriminalEvents = db1.CriminalEvents.Cast<ViewCriminalEvent>().ToList(); // THIS LINE THROWS THE EXCEPTION
viewModel.SelectedEntity = selectedCriminalEvent;
}
return View("Index", (object)viewModel);
}

请注意原始的 CriminalEvent 类和 InvestigationContext 都在我无法触及的 AIM.Police.DB dll 中找到

错误:

无法将类型“AIM.Police.DB.CriminalEvent”转换为类型“InvestigationSimulator.Models.CriminalEvent”。 LINQ to Entities 仅支持转换 EDM 原语或枚举类型。

为什么会出现此错误?随时欢迎对我的方法发表评论。

最佳答案

由于您获得了所有实体,您可以先具体化查询,然后执行转换。

这将在内存中执行 Cast,而不是尝试将其表述为查询翻译的一部分。出现错误是因为 LINQ to Entities 不支持将 SQL 转换为非实体类,即使它继承自实体类,因为没有将附加列映射到 SELECT 语句.通过具体化数据,然后在内存中执行 Cast (LINQ to Objects),可以避免转换错误。

但是,在您的情况下,您需要向后继承才能使其工作。为了让它工作,我建议让数据库模型实现 IDataModel 并完全避免强制转换,请参阅 http://msdn.microsoft.com/en-us/library/vstudio/bb738696(v=vs.100).aspxhttp://msdn.microsoft.com/en-us/library/wa80x488.aspx .特别是,您的部分类可以实现接口(interface)(老实说,不记得设计者是否允许您添加接口(interface)定义,因为这些天我只做代码优先)。请注意,这可能会完全消除对 View 特定模型的需求。

viewModel.CriminalEvents = db1.CriminalEvents.ToList();

我可能会做的替代方案是保持 View 模型完全独立(不让它从实体类继承)并使用 AutoMapper 在它们之间进行映射。

var criminalEvents = db1.CriminalEvents.ToList();
viewModel.CriminalEvents = Mapper.Map<CriminalEventViewModel>(criminalEvents);

关于c# - Cast() 异常 : LINQ to Entities only supports casting EDM primitive or enumeration types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20860396/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com