迁移到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 (将#修改为@)