如何解决无法使用MVC Core中的阴影属性来翻译LINQ表达式
我已经以类似于此post的方法来实现了Shadow Properties。到目前为止,我有一个损坏的LINQ查询,可以正常使用常规CreatedDate属性,但是现在我不能将其与Shadow属性一起使用:
public List<Gastos> GetGastosPorSeleccion(ApplicationDbContext context,int idProveedor,int idContenedor,int idPuerto)
{
var gastos = context.Gastos
.Where(
item =>
(
(item.IdProveedor == idProveedor)
&& (item.IdContenedor == idContenedor)
&& (item.IdPuerto == idPuerto)
)
)
.GroupBy(item => item.Tipo)
.Select(item => item.OrderByDescending(item => EF.Property<DateTime>(item,"CreatedDate"))
.FirstOrDefault())
.ToList();
return gastos;
}
这曾经在不使用CreatedDate作为EF.Property的情况下起作用,但是,它无法再翻译,也无法进行客户端查询,因为我没有将该属性作为对象的一部分。
该查询应该首先按某些表字段过滤,然后按类型分组并从每个分组中检索最新记录。
这是我得到的例外:
System.InvalidOperationException:'LINQ表达式 '(GroupByShaperExpression:KeySelector:(g.Tipo), ElementSelector:(EntityShaperExpression: 实体类型:Gastos ValueBufferExpression: (ProjectionBindingExpression:空投影成员) IsNullable:False)) .OrderByDescending(item => EF.Property(item,“ CreatedDate”)))'无法翻译。要么重写查询 可以翻译的表格,或切换到客户评估 通过插入对AsEnumerable()的调用来显式地 AsAsyncEnumerable(),ToList()或ToListAsync()。看到 https://go.microsoft.com/fwlink/?linkid=2101038了解更多信息。'
通过以下方式重写,查询在LINQPad6上运行良好:
Gastos
.Where(
item =>
(
(item.IdProveedor == idProveedor)
&& (item.IdContenedor == idContenedor)
&& (item.IdPuerto == idPuerto)
)
)
.GroupBy(item => item.Tipo)
.Select(item => item.OrderByDescending(item => item.CreatedDate)
.FirstOrDefault())
解决方法
您显示的帖子在某些方面不太准确,请尝试阅读telerik的这篇文章
https://www.telerik.com/blogs/how-to-use-the-navigation-or-shadow-property-in-entity-framework-core
您可以下载示例:
https://github.com/JSGund/ShadowPropertyInEFCore
Suerte Amigo。
---编辑
public static IQueryable<gastos> GetGastos(this ThisDBContext context,object obj1,object obj2,etc)
{
var query = from getgastos in context.Gastos
where item.IdProveedor == idProveedor &&
item.IdContenedor == idContenedor &&
item.IdPuerto == idPuerto
orderby EF.Property<DateTime>(item,"CreatedDate")) ascending
select getgastos;
return query;
}
我相信可能是这样的事情,我并没有在这里编写代码。
,使用功能链编写不可翻译的LINQ查询很容易。不管是否使用阴影属性都没有关系,查询是错误的,因为group by只能返回聚合结果或分组中使用的字段,而不是整个记录。这是SQL的限制,在这种情况下不要指望EF奇迹。
可以使用EF(任何当前版本)中不可用的窗口函数来有效地编写此查询
这根本不是一个答案,但是如果您可以使用第三方扩展名linq2db.EntityFrameworkCore-那么此查询应该可以工作:
var rnQuery = from getgastos in context.Gastos
where item.IdProveedor == idProveedor &&
item.IdContenedor == idContenedor &&
item.IdPuerto == idPuerto,select new
{
Entity = item,RN = Sql.Ext.RowNumber().Over()
.PartitionBy(item.Tipo)
.OrderByDesc(EF.Property<DateTime>(item,"CreatedDate")).ToValue()
};
var query = from q in rnQuery
where q.RN == 1
select q.Entity;
// switch to alternative LINQ translator
var query = query.ToLinqToDB();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。