2016-11-09 146 views
3

我試圖學習MVC,但在嘗試搜索客戶購買的產品時,我無法使用實體框架編寫代碼。我可以使用MS SQL查詢進行搜索,但我無法轉換爲實體框架。我的代碼;將MS SQL轉換爲實體框架

控制器:

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代碼實體框架;

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

如果您可以將此MS SQL代碼轉換爲足夠適合我的實體框架。

感謝任何人的幫助,所以對不起我的英語不好。

+0

顯示Order'的'你的'class'定義和'OrderProduct' – haim770

回答

1

感謝您的幫助,但這只是orderproduct列表。我需要訂單清單。我試試這個代碼(我編輯了JanneP的代碼,非常感謝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(); 

此代碼找到一個客戶訂購的產品。它的工作原理。

謝謝大家的幫助。

3

要檢索客戶的所有OrderProducts ID爲1,試試這個:

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

要只提取的ID,你可以這樣來做:

var productIds = db.OrderProduct 
         .Where(p => p.Orders.Any(o => o.Customers.Any(c => c.Id == 1)))        
         .Select(p => p.ProductId) 
         .ToList(); 
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(); 
+0

謝謝,有一點編輯的代碼工作。 – KoRnTuNeS

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但對實體框架和Linq不熟悉的人來說,一個有用的搜索詞是'101 LINQ samples'。

0

只需使用Include即可根據每個訂單檢索產品。

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

這將檢索訂單和每個訂單的產品。

你可以改變包括增加更多的導航屬性,我假設你有Order類中的Product屬性,您可以更改名稱IFT是錯誤的