2012-02-29 14 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()'は1つしかないことを意味し、存在しない場合はnullを返し、複数ある場合は例外をスローします。私はあなたが確かにそれを知ることができるとは思わないでしょう。同様に、あなたは1つの注文詳細項目だけを持っていますか? '.SingleOrDefault()'も同様に行います。複数の広告申込情報がある場合は、例外がスローされます。私はあなたのOrderDetailIdがあなたの注文と同じIDであるとは思わないでしょう。通常、注文IDのある行ごとに一意の詳細なIDを持っています –

+0

あなたの質問に想像できるタグを付けましたが、あなたが使っているデータベース技術は、あなたの質問についてです。これは本当にasp.net-mvcとは関係ありません。 –

+0

@MystereMan実際、この状況では、トランザクションごとに1回の購入に制限される予定のため、注文IDとともに1行に1つの詳細IDしか存在しません。あなたが言うから、これは悪い習慣のようです。私はよりよい解決策を見つけて、その解決策を反映するようにコードを変更すべきだと思います。 – Ecnalyr

答えて

2

生成されるSQLクエリを確認する必要があります。たとえば、次のようにすることができます。コンソールにクエリを出力します。これは、db.Log = Console.Out;を設定して行います。あなたのケースでWebページに出力するのと同様の方法があるはずです。 LINQの怠惰な性質は、物事を予測することを困難にします。

テーブル間に外部キーの関係を作成すると、OrderDetailsOrders.OrderIdのFKになります。これにより、Entity Frameworkはデータベースのナビゲーションプロパティを生成できます。あなたのコードは次のようになります:

[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

関連する問題