Структура сущностей динамическая ссылка где из общего источника с предложением dynamic where

#c# #entity-framework #linq #generics #dynamic-linq

Вопрос:

Я пытаюсь запросить Entity Framework, где оператор предложения с общим типом, когда имя таблицы неизвестно.

Я пытаюсь использовать динамический linq:

 public static IEnumerable<T> wherePost<T>(this IEnumerable<T> source,
            string predicate) where T : class
{    
    using (var context = new dbEntities())
    {
        string exp = predicate;//driverId>3
        var p = Expression.Parameter(typeof(T));
        var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p }, null, exp);    
    }
}
 

Это пример вызова wherePost

  db.Drivers.wherePost("City == "Paris"");
 

Не знаете, как продолжить и запросить DbSet<T> из Entity Framework с помощью DynamicExpression .

Комментарии:

1. является ли неизвестным типом сущности среды CLR?

2. это известно, как мы передаем его =>этот IEnumerable><T> источник. .нам нужно запросить сущность с помощью linq к таблице, известной только во время выполнения.

Ответ №1:

Я предполагаю, что вам не нужно менять имя таблицы на лету, а просто запрашивать таблицу с помощью фильтра.

 public static IQueryable<T> wherePost<T>(this IQueryable<T> source,
    string predicate) where T : class
{    
    string exp = predicate;//driverId>3
    var p = Expression.Parameter(typeof(T));
    var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p }, null, exp);    
    var whereExpr = Expression.Call(typeof(Queryable), nameof(Queryable.Where), new[] { typeof(T) }, source.Expression, e);

    return source.Provider.CreateQuery<T>(whereExpr);
}
 

И использование:

 db.Drivers.wherePost("City == "Paris"").ToList();
 

Комментарии:

1. Я получаю «IEnumerable<T>» не содержит определения для «Выражения», и невозможно найти доступный метод расширения «Выражение», принимающий первый аргумент типа «IEnumerable<T><T>» (у вас отсутствует директива using или ссылка на сборку?)

2. Это должно быть IQueryable