如何动态访问DbSet类型

本文关键字:访问 DbSet 类型 动态 何动态 | 更新日期: 2023-09-27 18:21:44

我使用LINQ表达式来动态构建select和where表达式。

选择方法如下:

public Expression<Func<TSource, TTarget>> GetSelectExpression<TSource, TTarget>()
    {
        ParameterExpression l_pe = Expression.Parameter(Base_type, "source");  
...            
        Expression<Func<TSource, TTarget>> l_return = Expression.Lambda<Func<TSource, TTarget>>(l_select, new ParameterExpression[] { l_pe });
        l_return.Compile();
        return l_return;
    }

Where方法如下所示:

public Expression<Func<TTarget, bool>> GetWhereExpression<TTarget>()
    {
        ParameterExpression l_pe = Expression.Parameter(Dto_type, "dto");
        ....
        Expression<Func<TTarget, bool>> l_return = Expression.Lambda<Func<TTarget, bool>>(l_or, new ParameterExpression[] { l_pe });
        l_return.Compile();
        return l_return;
    }

如果我调用以下语句,则一切正常:

var l_where = GetWhereExpression<CrudChangetaskDto>();
var l_select = GetSelectExpression<A_Changetask, CrudChangetaskDto>();               
IQueryable<CrudChangetaskDto> l_query = l_db.A_Changetask.Select(l_select).Where(l_where);
var lt_result = l_query.ToList();

由于更动态地使用WHERE和SELECT方法,我喜欢有一个返回IQueryable的方法,如下所示(PaltrConnect是数据库上下文):

IQueryable<TTarget> GetSearchhelpvalue<TSource, TTarget>(PaltrConnect context)
    {   
        var l_dbset = context.Set(typeof(TSource));            
        IQueryable<TTarget> l_query = l_dbset.Select(GetSelectExpression<TSource,TTarget>()).Where(GetWhereExpression<TTarget>());
        return l_query;
    }

不幸的是,这在语法上是不正确的。我收到错误消息System.Linq.IQUERABLE无法转换为System.Linq_IQUERABLE.

最后,我喜欢用以下方式调用GetSearchhelpvalue:

using (var l_db = new PaltrConnect)
  {
    IQueryable<CrudChangeTaskDto> l_query = GetSearchhelpvalue<A_Changetask, CrudChangetaskDto>(l_db);
    var lt_result = l_query.ToList();
  }

我如何访问与TSource对应的类型的DbSet,或者如何解决这个问题?

你的Stephan

如何动态访问DbSet类型

你太接近了。只是使用像这个一样的通用DbContext.Set<TEntity>()重载来代替非通用DbContext.Set(Type)

IQueryable<TTarget> GetSearchhelpvalue<TSource, TTarget>(PaltrConnect context)
    where TSource : class
{   
    return context.Set<TSource>()            
        .Select(GetSelectExpression<TSource,TTarget>())
        .Where(GetWhereExpression<TTarget>());
}

请注意,它需要class约束。