我尝试学习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();
}
数据库:
我尝试将此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代码转换为对我来说足够的实体框架。
感谢任何人的帮助,对不起我的英语不好。
答案 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
属性,如果错误则可以更改名称