[英]Entity Framework Core: How to dynamically get the DbSet from a derived Type?
[英]How to access DbSet type dynamically
我正在使用 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.IQueryable 無法轉換為 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>()
重載這樣
IQueryable<TTarget> GetSearchhelpvalue<TSource, TTarget>(PaltrConnect context)
where TSource : class
{
return context.Set<TSource>()
.Select(GetSelectExpression<TSource,TTarget>())
.Where(GetWhereExpression<TTarget>());
}
請注意,它需要class
約束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.