C# 无法将类型“DynamicClass1”强制转换为类型。LINQ to实体仅支持强制转换EDM基元或枚举类型
我花了好几个小时寻找我的问题的解决方案,但没有帖子帮我解决 我正在尝试使用Linq Entity Framework 6.0/MVC 5.0和库从数据库中获取记录C# 无法将类型“DynamicClass1”强制转换为类型。LINQ to实体仅支持强制转换EDM基元或枚举类型,c#,.net,linq,entity-framework,entity-framework-6,C#,.net,Linq,Entity Framework,Entity Framework 6,我花了好几个小时寻找我的问题的解决方案,但没有帖子帮我解决 我正在尝试使用Linq Entity Framework 6.0/MVC 5.0和库从数据库中获取记录 System.Linq.Dynamic; 完成下面的代码 using (var entities = new vskdbEntities()) { entity.DataFields = "id, stack_trace"; _list = entities.vsk_error_log .O
System.Linq.Dynamic;
完成下面的代码
using (var entities = new vskdbEntities())
{
entity.DataFields = "id, stack_trace";
_list = entities.vsk_error_log
.OrderBy(entity.Order)
.Select("New(" + entity.DataFields + ")")
.Skip(entity.PageSize * entity.PageNumber)
.Take(entity.PageSize)
.Cast<vsk_error_log>()
.ToList();
}
但在运行时,这会导致错误
中发生“System.NotSupportedException”类型的异常
EntityFramework.SqlServer.dll,但未在用户代码中处理
其他信息:无法将类型“DynamicClass1”强制转换为
键入“VideoKit.framework.vsk_error_log”。LINQ仅适用于实体
支持强制转换EDM基元或枚举类型
我知道Select子句存在强制转换问题,但不知道如何解决此强制转换问题
更新第一号:
如果我尝试使用如下所示的代码,它将正确地获取数据
using (var entities = new vskdbEntities())
{
var context = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)entities).ObjectContext;
lst = context.CreateObjectSet<vsk_error_log>().AsEnumerable().Select("new (id, stack_trace)").Cast<DynamicClass>().ToList();
}
但是使用类型检索数据
System.Linq.Dynamic.DynamicClass的通用列表
而不是vsk_错误_日志
如果我尝试使用适当的类vsk_error_log而不是DynamicClass进行强制转换,那么我会得到错误
无法将“DynamicClass1”类型的对象强制转换为
'VideoKit.framework.vsk_error_log'
返回的数据显示在屏幕截图中
该方法不知道如何将您创建的动态对象强制转换为您指定的类型,因此您必须手动执行此操作:
using (var entities = new vskdbEntities())
{
entity.DataFields = "id, stack_trace";
_list = entities.vsk_error_log
.OrderBy(entity.Order)
.Select("New(" + entity.DataFields + ")")
.Skip(entity.PageSize * entity.PageNumber)
.Take(entity.PageSize)
.Select(x => new vsk_error_log
{
Property1 = x.Property1,
Property2 = x.Property2,
//etc...
})
.ToList();
}
要从动态查询中获取实体本身,必须使用it关键字,而不是new: 从您的评论中,我了解到您正试图获得部分填充的vsk_error_log实体。可以使用查询的主要部分执行此操作,然后将DynamicClass实例转换为实体:
var result = new List<vsk_error_log>();
using (var entities = new vskdbEntities())
{
_list = entities.vsk_error_log
.OrderBy(entity.Order)
.Skip(entity.PageSize * entity.PageNumber)
.Take(entity.PageSize)
.Select("new (id, stack_trace)");
foreach(dynamic d in _list)
{
result.Add(new vsk_error_log { id = d.id, stack_trace = d.stack_trace } );
}
}
更新:
完整的代码,与下面的期望输出很好地工作
var _list = new List<vsk_error_log>();
using (var entities = new vskdbEntities())
{
var context = ((IObjectContextAdapter)entities).ObjectContext;
var lst = context.CreateObjectSet<vsk_error_log>()
.AsEnumerable()
.Select("new(id,stack_trace)")
.Cast<DynamicClass>()
.Skip(entity.PageSize * (entity.PageNumber - 1))
.Take(entity.PageSize)
.ToList();
foreach (dynamic d in lst)
{
_list.Add(new vsk_error_log { id = d.id, stack_trace = d.stack_trace });
}
}
我猜你需要选择x=>new vsk_error_log{y=x.y,z=x.z….}而不是.Cast。实际上,new也可以工作,但结果返回到DynamicClass1列表中,而不是正确的列表对象。我想说的是不要强制转换。你可以马上得到实体。你能用语法错误和引起它的查询更新你的问题吗?我附上了一个屏幕截图,上面有应用更新1号代码后返回的数据问题。感谢你的铸造解决方案成功。我在你的答案上贴了完整的工作代码。之前写在你们答案上的代码仍然是我在标题中提到的错误。
var _list = new List<vsk_error_log>();
using (var entities = new vskdbEntities())
{
var context = ((IObjectContextAdapter)entities).ObjectContext;
var lst = context.CreateObjectSet<vsk_error_log>()
.AsEnumerable()
.Select("new(id,stack_trace)")
.Cast<DynamicClass>()
.Skip(entity.PageSize * (entity.PageNumber - 1))
.Take(entity.PageSize)
.ToList();
foreach (dynamic d in lst)
{
_list.Add(new vsk_error_log { id = d.id, stack_trace = d.stack_trace });
}
}