ValueInjecter с IQueryable‹T›

Мне нужно сопоставить IQueryable<User> с IQueryable<SimpleUser> с помощью ValueInjecter.

Это возможно?

Я пытался:

return userRepo.GetUsers()
               .Select(o => new SimpleUser().InjectFrom(o))
               .Cast<SimpleUser>();

Но это не может быть переведено в хранимое выражение... ну, метод InjectFrom.

Может ли это сделать автомаппер?

Я хочу что-то похожее на это:

return from i in userRepo.GetUsers()
      select new SimpleUser{
            i.UserId,
            i.Name
      };

но с использованием какого-то картографического инструмента.


person Shawn Mclean    schedule 26.03.2011    source источник


Ответы (1)


Преобразуйте коллекцию в объекты перед выбором, и она должна работать. Обновлено с использованием PredicateBuilder для отображения фильтрации и разбиения по страницам, а также Динамический LINQ для сортировки.

var predicate = new PredicateBuilder<User>.True();
if (!string.IsNullOrEmpty( typeFilter ))
{
    predicate = predicate.And( u => u.Type == typeFilter );
}
if (!string.IsNullOrEmpty( nameFilter ))
{
    predicate = predicate.And( u => u.Name.StartsWith( nameFilter ));
}

// assumes sortColumn matches one of your user properties and
// sortDirection is either "ASC" or "DESC"
string sortOrder = string.Format( "{0} {1}", sortColumn, sortDirection ); 

return userRepo.GetUsers()
               .Where( predicate )
               .OrderBy( sortOrder )
               .Skip( (page-1) * usersPerPage )
               .Take( usersPerPage )
               .ToList()  // force the query and make these objects
               .Select(o => new SimpleUser().InjectFrom(o))
               .Cast<SimpleUser>();
person tvanfosson    schedule 26.03.2011
comment
Есть ли способ сделать это перед оценкой запроса? У меня есть элемент управления сеткой, который использует IQueryable для фильтрации, разбиения по страницам и сортировки. - person Shawn Mclean; 26.03.2011
comment
@Lol coder - вам нужно выполнить фильтрацию, сортировку, разбиение по страницам, прежде чем пытаться выполнить преобразование. Просто и понятно, преобразование не будет преобразовано в SQL, поэтому вам придется делать это с помощью LINQ для объектов, что означает, что все объекты должны находиться в памяти. Можно ли сопоставить представление, соответствующее SimpleUser? Затем вы можете настроить функцию SQL, соответствующую представлению, которое позволяет вам передавать параметры для фильтрации, сортировки, пейджинга. - person tvanfosson; 26.03.2011
comment
@tvanfosson Я отредактировал свой вопрос, чтобы показать, чего я хочу достичь. - person Shawn Mclean; 26.03.2011
comment
@Lol coder - вы получаете все записи в БД с вашим обновлением. вы не показали ничего, что помешало бы вам материализовать запрос (используя ToList), а затем применить код вашего картографа. Подозреваю, что перед конвертацией тоже можно сделать фильтрацию и т.п. Я обновлю с образцом. - person tvanfosson; 26.03.2011
comment
Должен ли я просто создать в репозитории параметры для пропуска фильтров, сортировки и прочего пейджинга? - person Shawn Mclean; 27.03.2011
comment
@Lol coder - если вы собираетесь повторно использовать такое поведение в других местах, да. - person tvanfosson; 27.03.2011