C# 用于连接表的Linq查询Mvc Asp

C# 用于连接表的Linq查询Mvc Asp,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我为一个电子商务应用程序创建了这些表,我用SQL创建了这些表,然后添加了ADO.NET并首先选择了代码。首先使用MVC默认标识码: Users: UserId(PK), FName, LName Product: ProductId(PK), ProductName, ProductPrice, CategoryId(FK) Category: CategoryId(PK), CategoryName Orders: OrderId(PK), OrderTotal, UserId(FK)

我为一个电子商务应用程序创建了这些表,我用SQL创建了这些表,然后添加了ADO.NET并首先选择了代码。首先使用MVC默认标识码:

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表中

示例如果用户A从“服装”类别购买产品“衬衫”,订单存储在订单表中,产品Id存储在订单详细信息表中

我写这篇文章只是为了给你们一个想法(我希望它清楚)

以下是数据库关系图的屏幕截图:


根据您的评论,我相信您当前的错误是

传递到字典中的模型项的类型为 'System.Collections.Generic.List1[f__AnonymousType92[System.String,System.Nul‌​标签1[System.Decimal]]]',但此字典需要类型为的模型项 'System.Collections.Generic.IEnumerable1[FypStore.Models.Product]'

看起来您的索引视图像这样绑定到产品类对象的集合

@model IEnumerable<YourEntityNamespace.Product>
要解决当前问题,可以删除投影并选择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();
即使这将修复您当前的错误,但这不是最佳解决方案。使用上述解决方案,我们将向视图传递整个产品(当然在where过滤器之后)实体。这些实体可能具有其他导航属性,在razor视图中以循环方式访问它们将再次生成sql查询。阅读更多有关此方法的问题

最好的解决方案是在通用项目中创建一个新的viewmodel类/DTO类,该类可供UI项目和数据访问项目(如果有多个项目)访问,并在LINQ表达式投影中使用,并将razor视图绑定到新视图模型类的集合

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类对象的列表返回到视图中,因此我们应该将razor视图更新为

@model List<YourNamespace.ProductVM>
<h1>Products</h1>
@foreach(var p in Model)
{
  <h2>@p.ProductName - @p.ProductPrice </h2>
}
@型号列表
产品
@foreach(模型中的var p)
{
@p、 ProductName-@p.ProductPrice
}

如果您查看绝对需要的属性,您可以向视图模型添加更多属性

根据您的评论,我相信您当前的错误是

传递到字典中的模型项的类型为 'System.Collections.Generic.List1[f__AnonymousType92[System.String,System.Nul‌​标签1[System.Decimal]]]',但此字典需要类型为的模型项 'System.Collections.Generic.IEnumerable1[FypStore.Models.Product]'

看起来您的索引视图像这样绑定到产品类对象的集合

@model IEnumerable<YourEntityNamespace.Product>
要解决当前问题,可以删除投影并选择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();
即使这将修复您当前的错误,但这不是最佳解决方案。使用上述解决方案,我们将向视图传递整个产品(当然在where过滤器之后)实体。这些实体可能具有其他导航属性,在razor视图中以循环方式访问它们将再次生成sql查询。阅读更多有关此方法的问题

最好的解决方案是在通用项目中创建一个新的viewmodel类/DTO类,该类可供UI项目和数据访问项目(如果有多个项目)访问,并在LINQ表达式投影中使用,并将razor视图绑定到新视图模型类的集合

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类对象的列表返回到视图中,因此我们应该将razor视图更新为

@model List<YourNamespace.ProductVM>
<h1>Products</h1>
@foreach(var p in Model)
{
  <h2>@p.ProductName - @p.ProductPrice </h2>
}
@型号列表
产品
@foreach(模型中的var p)
{
@p、 ProductName-@p.ProductPrice
}

如果您查看绝对需要的属性,您可以在视图模型中添加更多属性

这个问题与我试图帮助您的问题没有什么不同。很可能您根本不需要联接,但在不了解类之间的关系的情况下,我们无法给您一个具体的答案。@spender抱歉,我在那里给了您一个答复,我可以提供类。只是我没有太多时间来完成我正在做的任务。你写的LINQ查询有什么问题吗?@spender-picture of-database-diagramNo。不是数据库关系图。你的代码第一个类,显示了你在代码中建立的关系。这个问题与我试图帮助你的问题没有什么不同。很可能您根本不需要联接,但在不了解类之间的关系的情况下,我们无法给您一个具体的答案。@spender抱歉,我在那里给了您一个答复,我可以提供类。只是我没有太多时间来完成我正在做的任务。你写的LINQ查询有什么问题吗?@spender-picture of-database-diagramNo。不是数据库关系图。您的代码是显示您在代码中设置的关系的第一个类。这实际上删除了错误,但不返回任何产品。无论用户购买了什么产品,该产品的id都存储在OrderDetails表中。我想首先我必须获得该产品Id,然后找到该产品的类别(“服装”),并向用户显示服装类别中的更多产品。在代码中输入visual studio断点,查看您是否获得了正确的产品Id。您的查询看起来不像是从类别表中查询。您需要更正查询以获得所需的日期。此外,在评论中提出不同的问题也不是一个好主意。您最初的问题是关于编译错误。这实际上删除了错误,但没有返回任何产品。无论用户购买了什么产品,该产品的id都存储在OrderDetails表中。我想首先我必须得到产品Id,然后找到该产品的类别(“服装”),然后