Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Помогите с маппингом / 11 сообщений из 11, страница 1 из 1
19.11.2015, 11:14
    #39107502
asm-msadev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с маппингом
Есть класс Address сгенерированный EF
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
public partial class Address
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Address()
        {
            this.Accounts = new HashSet<Account>();
            this.UserAddresses = new HashSet<UserAddress>();
        }
    
        public string Id { get; set; }
        public string City { get; set; }
        public string Street { get; set; }
        public string House { get; set; }
        public string Corpus { get; set; }
        public string Flat { get; set; }
        public string SecretWord { get; set; }
        public Nullable<bool> IsVisible { get; set; }
        public string OwnerId { get; set; }
    
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Account> Accounts { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<UserAddress> UserAddresses { get; set; }
        public virtual User User { get; set; }
    }



Есть класс AddressDTO
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
public class AddressDTO
    {
        public AddressDTO()
        {
            Id = Guid.NewGuid().ToString();
            this.Accounts = new List<AccountDTO>();
            this.UserList = new List<UserDTO>();
        }

        public string Id { get; set; }
        public string City { get; set; }
        public string Street { get; set; }
        public string House { get; set; }
        public string Corpus { get; set; }
        public string Flat { get; set; }
        public string UserId { get; set; }
        public string SecretWord { get; set; }
        public string OwnerId { get; set; }

        public virtual ICollection<AccountDTO> Accounts { get; set; }
        public virtual ICollection<UserDTO> UserList { get; set; }

        public override string ToString()
        {
            return string.Concat(City, ", ", Street, ", д. ", House,
                                string.IsNullOrEmpty(Corpus) ? string.IsNullOrEmpty(Flat) ? string.Empty : ", кв. " + Flat : ", к. " + Corpus + ", кв. " + Flat);
        }
    }



Не могу сделать так, чтобы при маппинге в со-во UserList AddressDTO попадали значения из навигационного свойства UserAddress класса Address.

Вот как настраиваю маппер:
Код: c#
1.
2.
3.
4.
Mapper.CreateMap<Address, AddressDTO>().ForMember(x => x.UserList, w => w.MapFrom(n => (from u in n.UserAddresses select u.User).ToList()));

List<AddressDTO> addressIdList = Mapper.Map<List<Address>, List<AddressDTO>>
                ((from address in _database.UserAddress.GetAll() where address.UserId == userId select address.Address).ToList());



По итогу получаю в UserList 0 элементов.

Вообще, следующий запрос отрабатывает нормально и список заполняется экземплярами класса User:
Код: c#
1.
var userList = (from u in n.UserAddresses select u.User).ToList();



Что и где я делаю не так? Как настроить маппинг?
...
Рейтинг: 0 / 0
19.11.2015, 11:23
    #39107516
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с маппингом
asm-msadev,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Mapper.CreateMap<Address, AddressDTO>().ForMember(x => x.UserList, 
      w => w.MapFrom(n => n.UserAddresses.Select(t => t.User))); // никаких ToList внутри!!!!!

// неправильно:

var addressIdList = Mapper.Map<List<Address>, List<AddressDTO>>
                ((from address in _database.UserAddress.GetAll() where address.UserId == userId select address.Address).ToList());

// правильно:

var addressIdList = _database.UserAddress.GetAll()
   .ProjectTo<AddressDTO>()
   .Where(p => p.UserId == userId)
   .ToList(); // вот здесь только ToList -- в самом, самом конце.



постарайся избегать сахарного LINQ в маппинге, лучше fluent chain, как я привёл в примерах
...
Рейтинг: 0 / 0
19.11.2015, 11:44
    #39107546
asm-msadev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с маппингом
Ошибка здесь в строке
Код: c#
1.
.ProjectTo<AddressDTO>()


Код: c#
1.
2.
3.
4.
var addressIdList = _database.UserAddress.GetAll()
   .ProjectTo<AddressDTO>()
   .Where(p => p.UserId == userId)
   .ToList();



Выполнил Install-Package ProjectTo. Установил - не помогло. Куда копать? Почему та форма linq, которую я использую не предпочтителен? Мне так удобно ).
...
Рейтинг: 0 / 0
19.11.2015, 20:20
    #39108266
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с маппингом
asm-msadevInstall-Package ProjectTo

надо

Install-Package AutoMapper

а предпочтительно fluent, потому что, ты строишь запрос исходя из базового параметра под запроса (p => p), и явно видишь, что получается. сахар в подзапросах неуместен и плохо считывается.
...
Рейтинг: 0 / 0
19.11.2015, 20:21
    #39108268
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с маппингом
...
Рейтинг: 0 / 0
20.11.2015, 10:11
    #39108601
asm-msadev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с маппингом
Так установлен automapper. Обновил до версии 4.1.1. Все равно не работает ProjectTo ни как в твоем ответе, ни как в примере по ссылке. Что я делаю не так?
Код: c#
1.
_database.UserAddress.GetAll()


Возвращает IEnumerable.
...
Рейтинг: 0 / 0
20.11.2015, 10:13
    #39108607
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с маппингом
asm-msadev,

using на Queryable Extensions прописал?
...
Рейтинг: 0 / 0
20.11.2015, 10:28
    #39108626
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с маппингом
hVostt,
а ты не напутал?
Код: c#
1.
.Project().To<AddressDTO>()




asm-msadevВозвращает IEnumerable..AsQueryable
...
Рейтинг: 0 / 0
20.11.2015, 15:18
    #39109133
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с маппингом
Shocker.ProhVostt,
а ты не напутал?
Код: c#
1.
.Project().To<AddressDTO>()



Не, не напутал -- ты привёл устаревшую нотацию, которая уже deprecated (или obsolete).


Shocker.Proasm-msadevВозвращает IEnumerable..AsQueryable

Возможно, не взлетит. Должен возвращаться IQueryable от провайдера, либо EF, либо NHibernate, либо что там ещё, никаких ToList или ToArray там быть не должно в промежутке. Тогда взлетит. Иначе нужно юзать обычный маппинг и сильно потерять в производительности, при чём очень ощутимо.
...
Рейтинг: 0 / 0
20.11.2015, 15:19
    #39109134
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с маппингом
asm-msadevВозвращает IEnumerable.

А надо IQueryable. Иначе смысла в проекции нет.
...
Рейтинг: 0 / 0
26.11.2015, 06:37
    #39113698
asm-msadev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с маппингом
Всем спасибо. Разобрался.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Помогите с маппингом / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]