#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