Как создать динамический лямбда-запрос на соединение с использованием выражения на С#?C#

Место общения программистов C#
Ответить
Anonymous
 Как создать динамический лямбда-запрос на соединение с использованием выражения на С#?

Сообщение Anonymous »

Я новичок в запросах динамических выражений. Я хочу динамически создать запрос на соединение. Ниже приведен запрос, для которого мне нужен эквивалентный динамический запрос:

Код: Выделить всё

var lstNums = new List { 100, 101 };
var getAll = new StudentRepository().GetAll();   // returns IQueryable

var query = getAll.Join(lstNums, a => a.StudentId, b => b, (a, b) => a).ToList();
  • LstNums может представлять собой список любых примитивных типов данных.
  • GetAll содержит IQueryable, это может быть IQueryable любого объекта
  • Запрос будет содержать List записей после объединения с getAll и списком целых чисел. Но результатом может быть любой список сущностей. Список, то есть lstNum, может быть любым списком примитивных типов данных.
Вот что я пробовал:

Код: Выделить всё

public static IQueryable JoinQuery(this IQueryable outer, IEnumerable innerEntities, string firstEntityPropName,
Type typeSecondEntity, Type typeResultEntity, params object[] values)
{
LambdaExpression outerSelectorLambda = DynamicLinq.DynamicExpression.ParseLambda(outer.ElementType, null, firstEntityPropName, values);

ParameterExpression expnInput = Expression.Parameter(typeSecondEntity, "inner");
ParameterExpression expnResult = Expression.Parameter(typeResultEntity, "outer");

return outer.Provider.CreateQuery(
Expression.Call(
typeof(Queryable), "Join",
new Type[] { outer.ElementType, innerEntities.AsQueryable().ElementType, outerSelectorLambda.Body.Type, expnResult.Type },
outer.Expression, innerEntities.AsQueryable().Expression, Expression.Quote(outerSelectorLambda), expnInput,
expnResult));
}
Метод расширения:

Код: Выделить всё

public static IQueryable JoinQuery(this IQueryable outer, IEnumerable innerEntities, string firstEntityPropName, Type typeSecondEntity, Type typeResultEntity, params object[] values)
{
return (IQueryable)Extensions.JoinQuery((IQueryable)outer, (IEnumerable)innerEntities, firstEntityPropName, typeSecondEntity, typeResultEntity, values);
}
Примечание. Я установил пакет Nuget System.Linq.Dynamic версии 1.0.7 для динамического выражения linq.

Подробнее здесь: https://stackoverflow.com/questions/539 ... ssion-in-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»