2012-02-29 56 views
0

我正在使用下面的代碼來首先檢查一個字符串是否位於我的數據庫中一列中的某處。如果是這樣,那麼我需要通過查看數據庫的不同部分來檢查是否滿足一些附加標準(可以在下面的代碼中看到)。我不知道這是否是這樣做的一種有效的方法,或者如果有一個更簡單的方法:這是一種低效的方法來比較多個表中的數據嗎?

(從我的控制器)

[HttpPost] 
    public ActionResult Index(FormCollection sampleKey) 
    { 
     string code = sampleKey["sampleCode"]; 
     ViewBag.code = code; 
     // Need to check if this code is active 
     var order = db.Orders.SingleOrDefault(
      o => o.OrderCode == code 
       && o.Active == true); 
     if (order == null) 
     { 
      //Invalid 
     } 
     else 
     { 
      var orderIdent = db.OrderDetails.SingleOrDefault(
       p => p.OrderDetailId == order.OrderId); 
      var barIdent = db.Drink.SingleOrDefault(
       q => q.EstablishmentsID == orderIdent.DrinksId); 
      var barName = db.Establishment.SingleOrDefault(
       r => r.EstablishmentsId == barIdent.EstablishmentsID); 
      ViewBag.barId = barName.name; 
      ViewBag.sample = order.Email; 
      var custProfile = CustomProfile.GetUserProfile(); 
      if (custProfile.OwnedBar != barName.name) 
      { 
       //Not a match 
      } 
      else 
      { 
       //Match 
      } 
     } 
     return View(); 
    } 

這是什麼可擔心的?有沒有更有效的方式來執行我目前正在執行的操作?我是否應該更改引用表中包含數據的第一個表,我最終將其與表進行比較以避免似乎是比較不同表中信息的低效方式?

+0

你確定你永遠不能有超過一個訂單是活動的特定訂單代碼? '.SingleOrDefault()'表示只能有一個,如果沒有則返回null,如果有多個,則返回異常。我不認爲你肯定知道這一點。同樣,你只有一個訂單明細項目?你也爲此做了一個'.SingleOrDefault()'。如果有多個訂單項,則會引發異常。我也不認爲你的OrderDetailId與你的訂單是同一個Id,通常你有一個獨特的細節Id,每行用orderid fk – 2012-02-29 17:04:26

+0

你已經用任何可以想象的標籤標記了你的問題,但是你錯過了最重要的一個,那就是您正在使用的數據庫技術就是您的問題所在。它實際上與asp.net-mvc – 2012-02-29 17:05:58

+0

@MystereMan沒有任何關係。實際上,在這種情況下,我的訂單ID每行只會有一個詳細id,因爲我打算讓用戶限制爲每次交易一次購買。但從你所說的話來看,這似乎是不好的做法。我想我應該找到更好的解決方案並更改代碼以反映該解決方案。 – Ecnalyr 2012-02-29 17:20:45

回答

2

您應該檢查生成的SQL查詢。你可以通過例如將查詢輸出到控制檯,通過設置db.Log = Console.Out;完成。應該有類似的方法輸出到你的案例中的網頁。 LINQ的懶惰性讓事情難以預測。

除此之外,如果您在表格之間創建外鍵關係,即OrderDetails具有Orders.OrderId作爲FK,則可以使您的生活更輕鬆。這將允許實體框架爲您的數據庫生成導航屬性。與他們在一起你的代碼將如下所示:

[HttpPost] 
public ActionResult Index(FormCollection sampleKey) 
{ 
    string code = sampleKey["sampleCode"]; 

    var detail = db.Orders.Where(o => o.OrderCode == code && o.Active == true) 
     .Select(o => new { 
      OrderCode = o.OrderCode, 
      BarId = o.Drink.Establishment.Select(n => n.name), 
      Sample = o.Email 
      }) 
     .SingleOrDefault(); 

    if (detail != null) 
    { 
     ViewBag.code = detail.OrderCode; 
     ViewBag.barId = detail.BarId; 
     ViewBag.sample = detail.Sample; 

     var custProfile = CustomProfile.GetUserProfile(); 
     if (custProfile.OwnedBar == detail.BarId) 
     { 
      //Match 
     } 
     else 
     { 
      //Not a match 
     } 
    } 
    else 
    { 
     //Invalid 
    } 

    return View(); 
} 
+0

好點,謝謝。 – Ecnalyr 2012-02-29 18:07:22