2015-11-11 3 views
1

Я использую выражения 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

ответ

1

Вы так близки. Просто вместо отсутствия общего 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 ограничения.

+0

Вы абсолютно правы :). Вы дали мне правильное направление, где были противники. Большое спасибо за быстрый ответ. – user2213621

Смежные вопросы