Использование AutoMapper и Entity Framework для изменения того, какие столбцы извлекаются из таблицы базы данных

У нас есть новое требование, согласно которому нам нужно динамически получать список столбцов из таблицы. У нас есть 141 столбец в этой таблице, но, скажем, мы хотим вернуть только 2 или 3 из них, мы просто не знаем, какие 3, до времени выполнения.

Эти столбцы передаются как List<string> в надежде, что я смогу использовать отражение для доступа к свойству исходного объекта.

У нас уже есть поддержка для этого, поскольку мы можем передать TObjectDto в нашу службу, на которую проецируется наш IQueryable перед попаданием в базу данных, он просто не обрабатывает часть уравнения с динамическими столбцами.

До сих пор мне не удалось сделать что-то подобное с помощью MapFrom (не повезло, потому что отражение не поддерживается в LINQ, и это должен быть LINQ, потому что в противном случае он не поддерживается запрашиваемым)

http://docs.automapper.org/en/stable/Queryable-Extensions.html#supported-mapping-options

Есть ли какая-то причина, по которой я должен продолжать копаться в этой кроличьей норе и вместо этого просто использовать то, что у меня есть, для генерации сырого SQL?


person bla9x    schedule 16.07.2019    source источник
comment
Мне кажется, что ваш дизайн базы данных не подходит для этого приложения.   -  person Sir Rufo    schedule 16.07.2019
comment
Я не возражаю, это в некотором роде ядро ​​нашего приложения, и оно довольно массивное (в столбцах и данных).   -  person bla9x    schedule 16.07.2019
comment
Вам нужно 80 ~ различных запросов, которые вам нужно выбрать через строку (имя столбца или что-то еще лучше). Как насчет чего-то вроде Dictionary‹string, Func‹Task‹List‹string›››› ?   -  person Sir Rufo    schedule 16.07.2019
comment
docs.automapper.org/en/latest/   -  person Lucian Bargaoanu    schedule 16.07.2019


Ответы (1)


Я нашел решение, которым я очень доволен

Я объявил класс Dto, который наследуется непосредственно от класса моей модели.

    public class MyObjectDto : MyObject
    {
    }

Затем настройте профиль AutoMapper следующим образом.

CreateMap<MyObject, MyObjectDto>()
            .ForAllMembers(s => s.ExplicitExpansion());

Затем я курировал список полей, которые я хочу получить, и

                result = await myObjects
                    .ProjectTo<TMyObjectDto>(_mapperConfiguration, null, fieldsToRetrieve.ToArray())
                    .ToListAsync().ConfigureAwait(false);

Затем это только запрашивает значения базы данных для свойств в fieldsToRetrieve и оставляет остальные как значения null/по умолчанию, идеально подходящие для того, что мне нужно

Спасибо Люциану за то, что указал мне правильное направление в комментариях.

person bla9x    schedule 17.07.2019