Возврат Создать анонимный тип возврата из динамического Linq Select - PullRequest
0 голосов
/ 26 сентября 2019

Нужна поддержка OData для функции Azure.

Сейчас у меня есть все, что реализовано: Top, Skip, Filter, ExpandВыбор вызывает у меня проблему.

[EnableQuery]

Включает поддержку OData.Этот атрибут реализует и фильтр действий, который применяет запросы / фильтры Odata.

Он не работает с функцией из-за отсутствия actionFilterContext, который поступает из базового контроллера в WebApi (aspnetcore).

Я использовал этот ответ, чтобы построить выражение и применить его к IQueryable.

LINQ: динамический выбор

Это работает - однако проблема, с которой я сталкиваюсь сейчас, заключается в том, что у моего возвращаемого типа есть какие-либо необнуляемые свойства - я получаю значения по умолчанию обратно,

Запуск этой функции и $ select = электронная почта - я только хочу, чтобы электронная почта возвращалась.Что верно, но остальные свойства возвращаются.

enter image description here

По сравнению с запуском этого с проектом webapi и примененным атрибутом [EnableQuery]

enter image description here

Мне нужно иметь возможность создавать и возвращать новый анонимный тип.

Вот как я строю

       var expr = CreateSelectStatement<T>(propertyInfos);

        return data.AsQueryable().Select(expr).ToList();

...

        private static Expression<Func<T, T>> CreateSelectStatement<T>(IEnumerable<PropertyInfo> selectFields)
    {
        var xParam = Expression.Parameter(typeof(T), "e");

        var newStatement = Expression.New(typeof(T));

        var bindings = selectFields.Select(prop =>
        {
            var original = Expression.Property(xParam, prop);

            return Expression.Bind(prop, original);

        }).ToList();

        var xInit = Expression.MemberInit(newStatement, bindings);

        return Expression.Lambda<Func<T, T>>(xInit, xParam);

    }
...