如何解决迁移到EFCore 3.x时,需要以通用方式对实体进行动态查询过滤器
我们最近已迁移到EFCore3.x。以前,为了选择性地在实体之间引入功能,我们将
- 引入界面
public interface IUnusualFunctionality{
public string UnusualKey {get; set; }
}
- 然后,我们将在需要功能的实体中实现接口
public class Employee: Entity,IUnusualFunctionality{
public int Id {get; set;}
public string Name {get; set;}
public string Address {get; set;}
// <some other properties>
public string UnusualKey {get; set;}
}
offcourse相应的表中还有一列“ UnusualKey”。
- 然后我们将以通用方式使用该功能
// <somehwere in the code>
public static bool HasUnusualKey<TEntity>(TEntity entity,string theKey)
{
if(entity is IUnusualFunctionality unusual)
return string.Compare(unusual.UnusualKey,theKey) == 0;
return false;
}
public static void TaxAllRomeos(IQueryable<TEntity> query){
var romeos = query.Where(x=> HasUnusualKey(x,"Romeo")).ToList();
foreach(var romeo in romeos){
// apply double tax
}
// blah blah
}
现在这不适用于EFCore 3.1,因为它无法转换为sql。我试图研究添加自定义功能,但发现的主要是添加自定义功能并调用该功能。我确实来到了acoRSS sqlFragmentExpression,可以在其中指定自定义sql,但找不到找到注入where子句之类的方法
public static void TaxAllRomeos(IQueryable<TEntity> query){
var isRomeo = new sqlFragment(" UnusualKey = 'Romeo'");
var romeos = query.Where(x=> isRomeo(x)).ToList(); // what is the right way?
// blah blah
}
有什么想法吗?或至少指向文档? MSDN对此不是很描述。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。