我尝试了几个小时搜索解决方案以解决我的问题,但没有帖子帮助我。
我尝试使用带有库的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;
返回的数据显示在屏幕截图
中
答案 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();
}