Получить имя от одной модели к другой - PullRequest
0 голосов
/ 26 июня 2019

У меня есть две модели:

Одна для брендов

public class BrandVM
    {
        public BrandVM() { }

        public BrandVM(BrandDTO row)
        {
            Id = row.Id;
            Name = row.Name;
            Description = row.Description;
        }
        public int Id { get; set; }
        [Required]
        [StringLength(50, MinimumLength = 3)]
        public string Name { get; set; }
        [Required]
        public string Description { get; set; }
        public virtual BicycleVM BicycleVM { get; set; }
    }

и вторая для продуктов

public class BicycleVM
    {
        public BicycleVM() { }

        public BicycleVM(BicycleDTO row)
        {
            Id = row.Id;
            CategoryId = row.CategoryId;
            BrandId = row.BrandId;
            Mark = row.Mark;
            Year = row.Year;
            Color = row.Color;
            ImageName = row.ImageName;
        }

        public int Id { get; set; }
        [DisplayName("Category")]
        public int CategoryId { get; set; }
        [DisplayName("Brand")]
        public int BrandId { get; set; }
        [Required]
        [StringLength(50, MinimumLength = 3)]
        public string Mark { get; set; }
        public int Year { get; set; }
        [Required]
        [StringLength(50, MinimumLength = 3)]
        public string Color { get; set; }
        DisplayName("Image")]
        public string ImageName { get; set; }

        public string Category { get; set; }
        public string Brand { get; set; }

        public IEnumerable<SelectListItem> Categories { get; set; }
        public IEnumerable<SelectListItem> Brands { get; set; }
        public IEnumerable<string> GalleryImages { get; set; }
    }

public string Brand {get;задавать;} не существует в таблице, он используется только для просмотра.

Мне нужно как-то получить все бренды из одной таблицы и вставить их в свойство Brand.Идентификатор от Bramds должен совпадать с BrandId.

Как это выглядит для меня: я получаю все названия и идентификаторы бренда из первой таблицы.Сравните BrandId из продуктов с Id в брендах.Если они совпадают, чем product.Brand = brand.Name.

Попробовал это:

List<BicycleVM> listOfBicycleVM;
using (Db db = new Db())
{
  var init = db.Bicycles.ToArray()
      .Where(x => catId == null || catId == 0 || x.CategoryId == catId)
      .Select(x => new BicycleVM(x));


  listOfBicycleVM = init.ToList();

  var brand = db.Brands.ToList();

  listOfBicycleVM.ForEach(bicycle => bicycle.Brand = brand
          .FirstOrDefault(p => p.Id == bicycle.BrandId).ToString());

Не повезло: (

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Вы не должны пытаться объединить два ViewModels вместе для одного представления, которое побеждает их назначение. Однако вы можете объединить две модели в одну ViewModel.

Создайте один ViewModel, который содержит все необходимые данные, и назовите его что-то вроде «BicycleBrandVM». Заполните это либо в контроллере, либо где бы вы ни заполняли ViewModels прямо сейчас, затем передайте его своему View.

0 голосов
/ 26 июня 2019

Нашел этот обходной путь

var brand = db.Brands.ToArray().Select(x => new BrandVM(x));
                foreach (var item in listOfBicycleVM)
                {
                    if( brand.Any(x => x.Id == item.BrandId))
                    {
                        item.Brand = brand.First(c => c.Id == item.BrandId).Name;
                    }
                }

кажется, что это может работать без этой части

if( brand.Any(x => x.Id == item.BrandId))

Попробую позже

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...