【问题标题】:Linq query for joining tables Mvc Asp用于连接表 Mvc Asp 的 Linq 查询
【发布时间】:2015-11-27 18:07:01
【问题描述】:

我有这些用于电子商务应用程序的表,我在 SQL 中创建了这些表,然后添加了 ADO.NET 并选择了 Code First。优先使用 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 表中的用户以前的购买来获取 PRODUCTS。

示例如果用户 A 从类别“服装”中购买产品“衬衫”,订单存储在 Order 表中,产品 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);
}

这是数据库图的截图:

【问题讨论】:

  • 这个问题与我试图帮助你的last one 没有什么不同。很有可能您根本不需要 join,但在不知道您的类之间的关系的情况下,我们无法给您具体的答案。
  • @spender 抱歉,我在那里回复了你,我可以提供课程。只是我没有太多时间来完成我正在处理的这项任务。
  • 你写的 LINQ 查询有什么问题?
  • @spender s21.postimg.org/qvzspt8p3/Untitled.png数据库图图片
  • 没有。不是数据库图。您的代码优先类,显示您在代码中设置的关系。

标签: c# asp.net-mvc linq


【解决方案1】:

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

传入字典的模型项是类型 'System.Collections.Generic.List1[f__AnonymousType92[System.String,System.Nul‌​lable1[System.Decimal]]]',但是这个字典需要一个模型项类型 'System.Collections.Generic.IEnumerable1[FypStore.Models.Product]'

看起来您的 Index 视图绑定到这样的 Product 类对象的集合

@model IEnumerable<YourEntityNamespace.Product>

但是在您的索引操作中,从您的 LINQ 连接表达式,您正在对具有 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();

即使这样可以解决您当前的错误,但这并不是最佳解决方案。使用上述解决方案,我们将整个 Products(当然在您的 where 过滤器之后)实体传递给视图。这些实体可能具有其他导航属性,并且在您的 razor 视图中循环访问它们将再次生成 sql 查询。阅读更多关于这种方法的问题here

您最好的解决方案是在您的 UI 项目和数据访问项目(如果您有多个项目)可访问的公共项目中创建一个新的视图模型类/DTO 类,并在您的 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>
}

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

【讨论】:

  • 这实际上消除了错误,但没有返回任何产品。无论用户购买了什么产品,该产品的 id 都存储在 OrderDetails 表中。我想首先我必须获取该产品 ID,然后找到该产品的类别(“服装”)并向该用户显示更多来自服装类别的产品。
  • 在您的代码中放置 Visual Studio 断点,看看您是否得到了我想要的正确产品。您的查询看起来不像是从类别表中查询。您需要更正查询以获得所需的日期。此外,在评论中提出不同的问题也不是一个好主意。您最初的问题是关于您的编译错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多