Запрос и отображение в одном представлении данных, поступающих от многих ко многим с полезной нагрузкой в ​​Entity Framework 6 - PullRequest
0 голосов
/ 23 июня 2018

У меня есть эта сложная модель:

    public class Food
        {
        [Key]
        public int FoodID { get; set; }

        [Required]
        [DisplayName("Food Name")]
        public string FoodNameEN { get; set; }

        [Required]
        [DisplayName("Food Name")]
        public string FoodNameFR { get; set; }

        [Required]
        [DisplayName("Food Name")]
        public string FoodNameNL { get; set; }

        [Required]
        [DisplayName("Food Description")]
        public string FoodDescriptionEN { get; set; }

        [Required]
        [DisplayName("Food Description")]
        public string FoodDescriptionFR { get; set; }

        [Required]
        [DisplayName("Food Description")]
        public string FoodDescriptionNL { get; set; }

        public int CategoryID { get; set; }

        [Required]
        public bool Availability { get; set; }

        [Required]
        [DisplayName("Is Menu of the Day")]
        public bool DailyMenu { get; set; }

        public virtual Category Category { get; set; }
        public virtual ICollection<FoodAttributeValue> FoodAttributeValues { get; set; } = new HashSet<FoodAttributeValue>();
        public virtual ICollection<OrderDetail> OrderDetails { get; set; } = new HashSet<OrderDetail>();


 public class Category
    {
        [Key]
        public int CategoryID { get; set; }

        [Required(ErrorMessage = "Please enter a Category Name for English")]
        [DisplayName("Category Name")]

        public string CategoryEN { get; set; }

        [Required(ErrorMessage = "Please enter a Category Name for French")]
        [DisplayName("Category Name")]
        public string CategoryFR { get; set; }

        [Required(ErrorMessage = "Please enter a Category Name for Dutch")]
        [DisplayName("Category Name")]
        public string CategoryNL { get; set; }

        [Required]
        public bool Availability { get; set; }

        public virtual ICollection<Food> Foods { get; set; } = new HashSet<Food>();
    }

 public class Attribute
    {
        [Key]
        public int AttributeID { get; set; }
        public string AttributeNameEN { get; set; }
        public string AttributeNameFR { get; set; }
        public string AttributeNameNL { get; set; }
        public virtual ICollection<AttributeValue> AttributeValues { get; set; } = new HashSet<AttributeValue>();
    }

 public class AttributeValue
    {
        [Key]
        public int AttributeValueID { get; set; }
        public int AttributeID { get; set; }

        public string AttributeValueEN { get; set; }
        public string AttributeValueFR { get; set; }
        public string AttributeValueNL { get; set; }

        public virtual Attribute Attribute { get; set; }
        public virtual ICollection<FoodAttributeValue> FoodAttributeValues { get; set; } = new HashSet<FoodAttributeValue>();
    }

public class FoodAttributeValue
    {
        [Key]
        [Column(Order = 0), ForeignKey("Food")]
        public int FoodID { get; set; }

        [Key]
        [Column(Order = 1), ForeignKey("AttributeValue")]
        public int AttributeValueID { get; set; }

        public decimal Price { get; set; }
        public string CreatorUserName { get; set; }

        public DateTime DateCreated { get; set; }

        public virtual Food Food { get; set; }
        public virtual AttributeValue AttributeValue { get; set; }
    }

Атрибуты содержит тип атрибута, такой как размер или объем

AttributeValue содержит значения для атрибута, например «Нормальный размер» или «Большой».

FoodAttributeValue является таблицей «многие ко многим» с полезной нагрузкой «Цена». Таким образом, в основном, одна и та же еда бывает разных размеров с разными ценами.

My DatabaseContext:

  public class ModelContext: DbContext
  {
    public DbSet<Category> Categories { get; set; }
    public DbSet<Food> Foods { get; set; }
    public DbSet<Attribute> Attributes { get; set; }
    public DbSet<AttributeValue> AttributesValues { get; set; }
    public DbSet<FoodAttributeValue> FoodAttributeValues { get; set; }
  }

Как я могу запросить модель, используя linq, с намерением иметь в том же представлении список продуктов, которые также содержат атрибуты продукта, его атрибуты и, в конечном итоге, цену?

Заранее спасибо!

1 Ответ

0 голосов
/ 25 июня 2018

В MVC рекомендуется создать ViewModel (или DTO), предназначенную для представления, которое вы хотите отобразить.Как правило, старайтесь избегать использования POCO вашей сущности в представлении.

Так, например:

public class FoodIndexViewModel
{
    // Add the various entity fields you want here.
    public int FoodID { get; set; }
    ...
    // Take all these annotations out of your entity model. They belong here.
    [Required]
    [DisplayName("Food Name")]
    public string FoodNameEN { get; set; }
    ...
    [Required(ErrorMessage = "Please enter a Category Name for English")]
    [DisplayName("Category Name")]
    public string CategoryEN { get; set; }

    public decimal Price { get; set; } 

    ... etc. etc.
}

Теперь вы можете составить запрос LINQ для заполнения модели представления.AutoMapper может значительно облегчить этот процесс.

var listOfFoodsVM = context.Foods
    .Where(food => food.Availability)
    .Select(food => new FoodIndexViewModel
    {
        FoodId = food.FoodId,
        FoodNameEN = food.FoodNameEN,
        ... // other fields from food
        CategoryEN = food.Category.CategoryEN,
        // Here you would either pick a single value from the list based on your criteria
        Price = food.FoodAttributeValues.FirstOrDefault(fav => fav.AttributeValueID == 1).Price
        // or you could include a collection of FoodAttributes in your viewmodel:
        FoodAtributes = food.FoodAttributes
        ... etc.     
    }).ToList();

Теперь вы передаете это в ваше представление.

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