2015-11-27 2 views
0

У меня эти таблицы для приложения электронной коммерции, и я создал эти таблицы в SQL, а затем добавил ADO.NET и выбрал Code First. Используемый код идентификации по умолчанию MVC Сначала:Запрос Linq для соединения таблиц Mvc Asp

Users: UserId(PK), FName, LName 

Product: ProductId(PK), ProductName, ProductPrice, CategoryId(FK) 

Category: CategoryId(PK), CategoryName 

Orders: OrderId(PK), OrderTotal, UserId(FK) 

OrderDetails: OdId(PK), OrderId(FK), ProductId(FK), Quantity 

Каждый продукт относится к некоторым категориям. Пользователь может разместить заказ, а дальнейшая информация о заказе хранится в таблице OrderDetails.

Я хочу получить ПРОДУКТЫ на основе предыдущих покупок пользователей, которые я сохранил в таблице Order и OrderDetails.

Пример Если пользователь А покупает продукт «рубашка» из категории «Одежда», порядок хранится в таблице заказа и продукт Id хранится в таблице OrderDetails

Я написал это только, чтобы дать вам ребята идея (я надеюсь, что его ясно)

public ActionResult Index() 
{ 
    string user = User.Identity.GetUserName(); 
    var q = db.OrderDetails.Where(m => m.Order.Email == user).ToList(); 
    var query = (from pd in db.Products 
       join od in db.OrderDetails on pd.ProductId equals od.ProductID 
       join oo in db.Orders on od.OrderId equals oo.OrderId 

       where oo.UserId == user 
       select new 
       { 
        ProductName = pd.Name, 
        ProductPrice = pd.Price, // six value 
       }).ToList(); 
    return View(query); 
} 

Вот скриншот диаграммы базы данных:

enter image description here

+0

Этот вопрос ничем не отличается от вашего [последнего] (http://stackoverflow.com/questions/33959756), где я пытался вам помочь. Вполне вероятно, что вам совсем не нужно присоединиться, но, не зная отношений между вашими классами, мы не можем дать вам конкретного ответа. – spender

+0

@spender Извините, но я дал вам ответ там, где я могу предоставить классы. Его просто у меня нет много времени для этого задания, над которым я работаю. – user3395667

+0

В чем проблема с запросом LINQ, который вы написали? –

ответ

0

Вашего комментария, я считаю, текущая ошибка

Модели элемент передается в словарь типа «System.Collections.Generic.List1 [<> f__AnonymousType92 [System.String, System.Nul lable1 [System.Decimal]]], но этот словарь требует модель элемента типа 'System.Collections.Generic.IEnumerable1 [FypStore.Models.Product]

Похоже, ваш Индексный обязан набор объектов класса Product, подобных этому

@model IEnumerable<YourEntityNamespace.Product> 

Но в вашем действии индекса из выражения LINQ join вы делаете проекцию анонимного типа с 2 свойствами, ProductName и ProductPrice.

var query = (from pd in db.Products 
       join od in db.OrderDetails on pd.ProductId equals od.ProductID 
       join oo in db.Orders on od.OrderId equals oo.OrderId 

       where oo.UserId == user 

       select new // Projection to Anonymous type 
       { 
        ProductName = pd.Name, 
        ProductPrice = pd.Price, // six value 
       }).ToList(); 

Чтобы устранить текущую проблему, вы можете удалить проекцию и выбрать pd.

var query = (from pd in db.Products 
       join od in db.OrderDetails on pd.ProductId equals od.ProductID 
       join oo in db.Orders on od.OrderId equals oo.OrderId 

       where oo.UserId == user      
       select pd).ToList(); 

Даже если это исправит вашу текущую ошибку, это не оптимальное решение. С приведенным выше решением мы передаем целые Продукты (после вашего фильтра, который, конечно,). Эти объекты могут иметь другие свойства навигации и доступ к ним в вашем бритвенном представлении в цикле снова будут генерировать запросы sql. Узнайте больше о проблемах с этим подходом here.

Ваше лучшее решение - создать новый класс viewmodel/класс DTO в общем проекте, который доступен для вашего проекта пользовательского интерфейса и проекта доступа к данным (если у вас есть несколько проектов), и используйте это в ваших выражениях LINQ и привяжите их ваш вид бритвы в коллекцию вашего нового класса модели просмотра.

public class ProductVM 
{ 
    public string ProductName {set;get;} 
    public decimal ProductPrice {set;get;} 
} 

И в вашем выражении LINQ используйте это в проекции.

var products = (from pd in db.Products 
      join od in db.OrderDetails on pd.ProductId equals od.ProductID 
      join oo in db.Orders on od.OrderId equals oo.OrderId 

      where oo.UserId == user 
      select new ProductVM 
      { 
       ProductName = pd.Name, 
       ProductPrice = pd.Price, // six value 
      }).ToList(); 
    return View(products); 

Поскольку мы теперь возвращает список объектов класса ProductVM на наш взгляд, мы должны обновить вид бритвы

@model List<YourNamespace.ProductVM> 
<h1>Products</h1> 
@foreach(var p in Model) 
{ 
    <h2>@p.ProductName - @p.ProductPrice </h2> 
} 

Вы можете добавить дополнительные свойства для вашей модели представления, если смотреть абсолютно нуждаются в них

+0

Это действительно устранило ошибку, но не возвращает никаких продуктов. Независимо от того, какие товары пользователь приобрел, идентификатор этого продукта хранится в таблице OrderDetails. Наверное, сначала я должен получить идентификатор продукта, а затем найти категорию этого продукта («Одежда») и показать, что пользователь больше товаров из категории одежды. – user3395667

+0

Положите визуальные точки разрыва студии в свой код и увидите, что получаете правильный продукт. Ваш запрос не похож на запрос из таблицы категорий. Вам нужно исправить запрос, чтобы получить нужный вам день. Также не стоит задавать другой вопрос в комментарии. Ваш первоначальный вопрос касался вашей ошибки компиляции. – Shyju

Смежные вопросы