无法将类型“DynamicClass1”强制转换为<t>类型。 LINQ to Entities仅支持转换EDM原语或枚举类型</t>

时间:2014-10-17 17:30:41

标签: 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
           .OrderBy(entity.Order)
           .Select("New(" + entity.DataFields + ")")
           .Skip(entity.PageSize * entity.PageNumber)
           .Take(entity.PageSize)
           .Cast<vsk_error_log>()
           .ToList();
}

但是在运行时这会导致错误

  

类型&#39; System.NotSupportedException&#39;的例外情况发生在   EntityFramework.SqlServer.dll但未在用户代码中处理

     

其他信息:无法投放类型&#39; DynamicClass1&#39;至   输入&#39; VideoKit.framework.vsk_error_log&#39;。 LINQ to Entities only   支持转换EDM原语或枚举类型。

我知道Select子句存在投射问题,但不知道如何修复此投射问题。

更新否1:

如果我尝试使用如下所示的代码,它将正确获取数据

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_error_log

如果我尝试使用适当的类vsk_error_log而不是DynamicClass进行转换,那么我会收到错误

  

无法转换类型为&#39; DynamicClass1&#39;的对象输入   &#39; VideoKit.framework.vsk_error_log&#39;

返回的数据显示在屏幕截图

enter image description here

2 个答案:

答案 0 :(得分:1)

要从动态查询中获取实体本身,您必须使用it关键字,而不是new

using (var entities = new vskdbEntities())
{
     _list = entities.vsk_error_log
           .OrderBy(entity.Order)
           .Select("it") // here "it"
           .Skip(entity.PageSize * entity.PageNumber)
           .Take(entity.PageSize)
           .ToList();
}

根据您的评论,我了解到您正在尝试部分填充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 });
         }
}

答案 1 :(得分:0)

Cast<type>()方法不知道如何将您创建的动态对象强制转换为您指定的类型,因此您必须手动执行此操作:

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();
}