如何动态访问 DbSet 类型
How to access DbSet type dynamically
我正在使用 LINQ 表达式来动态构建 select 和 where 表达式。
select 方法如下所示:
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.IQueryable cannot be converted into System.Linq.IQueryable.
最后,我喜欢通过以下方式调用 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或者如何解决?
你的
斯蒂芬
你们真亲密。只是代替非通用 DbContext.Set(Type)
使用通用 DbContext.Set<TEntity>()
overload 像这样
IQueryable<TTarget> GetSearchhelpvalue<TSource, TTarget>(PaltrConnect context)
where TSource : class
{
return context.Set<TSource>()
.Select(GetSelectExpression<TSource,TTarget>())
.Where(GetWhereExpression<TTarget>());
}
注意需要class
约束。
我正在使用 LINQ 表达式来动态构建 select 和 where 表达式。
select 方法如下所示:
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.IQueryable cannot be converted into System.Linq.IQueryable.
最后,我喜欢通过以下方式调用 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或者如何解决?
你的 斯蒂芬
你们真亲密。只是代替非通用 DbContext.Set(Type)
使用通用 DbContext.Set<TEntity>()
overload 像这样
IQueryable<TTarget> GetSearchhelpvalue<TSource, TTarget>(PaltrConnect context)
where TSource : class
{
return context.Set<TSource>()
.Select(GetSelectExpression<TSource,TTarget>())
.Where(GetWhereExpression<TTarget>());
}
注意需要class
约束。