C# 无法将类型“DynamicClass1”强制转换为类型。LINQ to实体仅支持强制转换EDM基元或枚举类型

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

我花了好几个小时寻找我的问题的解决方案,但没有帖子帮我解决

我正在尝试使用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
           .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 });
         }
}