我花了几个小时搜索解决方案,但没有一个帖子能够帮助我。
我试图使用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 to Entities仅支持转换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,那么会出现错误
无法将类型为“DynamicClass1”的对象强制转换为类型 “VideoKit.framework.vsk_error_log”。
返回的数据如屏幕截图所示:
.Select( x => new vsk_error_log { y = x.y, z = x.z .... })
代替.Cast()
。 - DavidG