将MS SQL转换为实体框架

时间:2016-11-09 19:57:50

标签: sql sql-server asp.net-mvc entity-framework

我尝试学习MVC,但是当我尝试搜索客户购买的产品时,我无法使用Entity Framework进行编写。我可以使用MS SQL查询进行搜索,但我无法转换为Entity Framework。我的代码;

控制器:

    public ActionResult Orders()
    {
        Customer c = db.Customers.Find(Session["UserID"]);
        List<Order> userorders= db.Orders.Where(x => x.CustomerID == c.ID).ToList();
        List<OrderProduct> orderproducts = db.OrderProducts.Where(x => x.OrderID = userorders.ID); //This code not work
        return View();
    }

数据库:

My Database

我尝试将此MS SQL代码转换为Entity Framework;

"select ID from Products where ID IN (select ProductID from OrderProduct where OrderID IN (select ID from Orders where CustomerID = 1))"

如果您可以将此MS SQL代码转换为对我来说足够的实体框架。

感谢任何人的帮助,对不起我的英语不好。

5 个答案:

答案 0 :(得分:4)

要检索ID为1的所有var orderProducts = db.OrderProduct .Where(p => p.Orders.Any(o => o.Customers.Any(c => c.Id == 1))) .ToList(); 客户,请尝试以下操作:

var productIds = db.OrderProduct
                      .Where(p => p.Orders.Any(o => o.Customers.Any(c => c.Id == 1)))                              
                      .Select(p => p.ProductId)
                      .ToList();

要仅检索ID,您可以这样做:

<?php
  $data = [
    'route' => [
      [
        'id' => 1,
        'departure_station' => 'Cluj-Napoca, Autogara',
        'destination_station' => 'Bucuresti Nord',
        'departure_date'  => 'Joi, 18 Mar 2017. 20:45',
        'arrival_date' => 'Vi, 19 Mar 2017. 02:15',
        'price' => 150
      ],
      [
        'id' => 2,
        'departure_station' => 'Budapest',
        'destination_station' => 'London',
        'departure_date'  => 'Vin, 28 Mar 2017. 20:45',
        'arrival_date' => 'Lu, 29 Mar 2017. 02:15',
        'price' => 250
      ],
      [
        'id' => 3,
        'departure_station' => 'Paris',
        'destination_station' => 'Berlin',
        'departure_date'  => 'Joi, 18 Mar 2017. 20:45',
        'arrival_date' => 'Vi, 19 Mar 2017. 02:15',
        'price' => 450
      ],
    ]
  ];

  foreach($data as $key => $route) {
    foreach ($route as $element) {         
      $html = $this->load->view("front/curse_interne.php", $element, true);
      echo json_encode(array("status" => 1, "html" => $html));
    }
  }
?>

答案 1 :(得分:1)

感谢您的帮助,但这只是订单产品清单。我需要订单清单。我试试这段代码(我编辑了JanneP&#39的代码。非常感谢JanneP):

List<Product> products = (from co in db.Customers
                                          join o in db.Orders on co.ID equals o.CustomerID
                                          join op in db.OrderProducts on o.ID equals op.OrderID
                                          join p in db.Products on op.ProductID equals p.ID
                                          where co.ID == c.ID
                                          select p).ToList();

此代码找到一个客户订购的产品。它有效。

感谢大家的帮助。

答案 2 :(得分:0)

您可以创建连接条件。此外,在需要用两个相同的符号表示条件的情况下,而不是一个。这应该有效:

    List<OrderProduct> ürünler = (from c in db.Customers
      join o in db.Orders on c.ID equals o.CustomerID
      join op in db.OrderProducts on o.ID equals op.OrderID
      where c.ID == 1
      select op).ToList();

答案 3 :(得分:0)

由于您的数据库已使用外键约束正确设置,因此实体框架将能够使用“导航属性”。这使您可以非常轻松地编写查询,如下所示。

List<Product> products = db.Products.Where(e => e.OrderProduct.Orders.CustomerID == 1).ToList();

在原始SQL中,您只需要产品ID。这是你如何做到的。

List<int> productIds = db.Products.Where(e => e.OrderProduct.Orders.CustomerID == 1).Select(e => e.ID).ToList();

对于那些对SQL有良好掌握但对Entity Framework和Linq不熟悉的人来说,一个有用的搜索词是“101 LINQ samples”。

答案 4 :(得分:0)

只需使用Include检索每个订单的产品。

    List<Order> userorders= db.Orders.Include(a=>a.Product).Where(x => x.CustomerID == c.ID).ToList();

这将检索订单以及产品的每个订单。

您可以更改Include以添加更多导航属性,我假设您在Product类中有Order属性,如果错误则可以更改名称