微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

迁移到EFCore 3.x时,需要以通用方式对实体进行动态查询过滤器

如何解决迁移到EFCore 3.x时,需要以通用方式对实体进行动态查询过滤器

我们最近已迁移到EFCore3.x。以前,为了选择性地在实体之间引入功能,我们将

  1. 引入界面
     public interface IUnusualFunctionality{
        public string UnusualKey {get; set; }
     }
  1. 然后,我们将在需要功能的实体中实现接口
    
    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”。

  1. 然后我们将以通用方式使用该功能
    // <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 举报,一经查实,本站将立刻删除。