Я использую выражения LINQ, чтобы динамически создавать выражения и выражения.Как динамически получить доступ к типу DbSet
Выбор: метод выглядит следующим образом:
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;
}
Где метод выглядит следующим образом:
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 мне нравится иметь метод ret 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();
}
Как я могу получить доступ к DbSet типа, который соответствует TSource или как это можно решить?
Ваш Stephan
Вы абсолютно правы :). Вы дали мне правильное направление, где были противники. Большое спасибо за быстрый ответ. – user2213621