代码之家  ›  专栏  ›  技术社区  ›  Johan Sánchez

生成接受任何实体的动态查询

  •  1
  • Johan Sánchez  · 技术社区  · 6 年前

    我正在尝试用LINQ创建一个查询,然后我想将生成的查询分配给一个实体类。 例如,我有三个具有相同列的实体。

    • A姓名,姓
    • B姓名,姓
    • C姓名,姓

    例如,我可以生成一个LINQ,其中闭包首先执行一个包含实体选择的var。

    var lQuery = A.Select(t => t);
    

    如果名称或姓氏不为空,则添加闭包

    if (!string.IsNullOrEmpty(pName))
    {
        lQuery = lQuery.Where(x => x.Name == pName);                    
    }
    if (!string.IsNullOrEmpty(pLastName))
    {
        lQuery = lQuery.Where(x => x.LastName == pLastName);
    }
    

    最后,我从生成的lquery返回一个a的列表。

    是否有方法生成一个查询,然后在末尾将其分配给我的一个实体?

    1 回复  |  直到 6 年前
        1
  •  0
  •   TanvirArjel    6 年前

    您可以执行以下操作:

    public async Task<List<object>> GetFilteredEntityList(string entityClassName, string name, string lastName)
    {
          var type = Assembly.GetExecutingAssembly()
                    .GetTypes()
                    .FirstOrDefault(t => t.Name == entityClassName);
    
          if (type != null)
          {
             DbSet dbSet = _dbContext.Set(type);
    
             IQueryable entityListQueryable = dbSet;
             if (!string.IsNullOrEmpty(name))
             {
                  entityListQueryable = entityListQueryable.Where("Name == @0", name);
             }
    
             if (!string.IsNullOrEmpty(lastName))
             {
                  entityListQueryable = entityListQueryable.Where("LastName == @0", lastName);
             }
    
             return await entityListQueryable.ToListAsync();
         }
         else
         {
            throw new Exception("Table name does not exist with the provided entity class name");
         }
    }
    

    以及 通用的 上述方法的版本为:

    public class FilterEntity<TEntity> where TEntity: class
    {
        YourDbContext _dbContext = new YourDbContext();
        public async Task<List<TEntity>> GetFilteredEntityList(string name, string lastName)
        {
            DbSet<TEntity> dbSet = _dbContext.Set<TEntity>();
    
            IQueryable<TEntity> entityListQueryable = dbSet;
            if (!string.IsNullOrEmpty(name))
            {
                entityListQueryable = entityListQueryable.Where("Name == @0", name);
            }
    
            if (!string.IsNullOrEmpty(lastName))
            {
                entityListQueryable = entityListQueryable.Where("LastName == @0", lastName);
            }
    
            return await entityListQueryable.ToListAsync();
        }
    }
    

    用法:

    List<Teacher> teachreList = await new FilterEntity<Teacher>().GetFilteredEntityList("Tanvir", null);
    

    注意:不要忘记安装 System.Linq.Dynamic Nuget