2011-05-18 11 views
2

ただし、プログラムがクエリポイントで停止するたびに、2つのデータベースからのlinqクエリがあります。私はVSを使用してlinqをデバッグする方法を知らない。誰かが私がここで間違っていることを理解するのを助けることができますか?ありがとうございました。2つのデータベースからのlinqクエリ

public List<Promotion> GetBroder(string source) 
     { 
      string _connString = ConfigurationManager.AppSettings["DB1"]; 
      PromotionDataContext dc = new PromotionDataContext(_connString); 
      string connString = ConfigurationManager.AppSettings["DB2"]; 
      ReachDirectDataContext RDdc = new ReachDirectDataContext(connString); 
      return (from b in RDdc.BrokerNos 
        from p in dc.Promotions 
        where p.Source == source && p.Broker == b.BrokerNo1 
        select new Promotion() {Code=p.Code,BrokerName=b.Name}).ToList<Promotion>(); 
     } 
+0

あなたはデータアクセス技術のどのような種類を使用している(例:? EF + Linq-to-entities) –

+1

エンティティへのlinq –

答えて

1

次のように使用して、生成されたSQLをLinq文に表示できます。

ReachDirectDataContext RDdc = new ReachDirectDataContext(connString); 

RDdc.Log = Console.Out; 

return (from b in RDdc.BrokerNos 
     from p in dc.Promotions  
     where p.Source == source && p.Broker == b.BrokerNo1 
     select new Promotion() {Code=p.Code,BrokerName=b.Name}).ToList<Promotion>(); 

次のようにクエリを区切ります。

var promotions = from p in dc.Promotions 
       where p.Source == source 
       select p; 

var brokers = from o in promotions 
       join b in RDdc.BrokerNos on o.Broker equals b.BrokerNo1 
       select new Promotion 
       { 
        Code = o.Code, 
        BrokerName = b.Name 
       }; 
return brokers.ToList(); 
+0

ログアウトで「System.InvalidOperationException」と表示されましたが、ここに構文エラーは表示されません。 –

+0

SQLで両方のデータベースから選択できることを確認できますか? SQLでは、3つの部分からなるクエリ(database.schema。テーブル)を作成します。 Linqが何をするのか分かりません。編集で上記の内容を試してみてください。 – Leons

+0

@ Leon私はあなたのコードを試しました、それは "クエリが別のデータコンテキストで定義された項目への参照を含んでいる"というエラーで出てきます。何か案が? –

2

linq文は正常です。デバッグを助けるために、私はlinqクエリをローカル変数に代入し、ローカル変数を返すと便利です。その後、returnステートメントにブレークポイントを設定し、ブレークポイントでデバッガが停止すると、クエリローカル変数を調べて、その内容を対話形式で確認することができます。 VSのローカルウィンドウやイミディエイトウィンドウを使用して、アプリの変数内をサーフィンして何が起こっているかを見ることができます。

特に、linqクエリへの入力が実際にデータを提供していることを再度確認します。 RDdc.Brokernosが空でないこと、およびdc.Promotionsなどが空であることを確認します。これらが空の場合、結果は空になります。バグを「上流」で追跡します。

マイナーポイント:選択項目の.ToList()呼び出しでtypeパラメータを指定する必要はありません。コンパイラは自動的に型を推論します。

0

二重のものは疑いがあります。 (これは、それはあなたが目指していたものであればSQLのと同等のは、JOINステートメントではありません。)

あなたはコンテキストを組み合わせることができた場合:

EDMXでBrokerNosとプロモーションとの関係を作成し、ナビゲーションプロパティを使用してみてくださいクエリで。例えば

var result = dc.Promotions.Where(p => p.Source == source). 
    Select(p => new Promotion() { 
     Code = p.Code, 
     BrokerName = p.Broker.Name, // use new navigation property here 
    }); 

(交差点がないDB上で、メモリ内で行われますされていない場合!!!:

var result1 = dc.Promotions.Where(p => p.Source == source). 
    Select(p => new Promotion() { 
     Code = p.Code, 
     BrokerId = p.BrokerId, // add id property for intermediate results 
    }).ToList(); 

var result2 = RDdc.Brokers.ToList(); 

var finalResult = result1.Where(p => result2.Contains(b => b.BrokerId == p.BrokerId)).Select(p => new Promotion{ 
     Code = p.Code, 
     BrokerName = result2.Single(b => b.BrokerId == p.BrokerId).Name, 
    }); 
+0

両方のdataContextは同じデータベースサーバーインスタンスにありますか? - もしそうなら、おそらく両方を使用してそれらを統合するedmxを作成します。その後、そこへの文脈を開きます。このリンクを参照してください:http://blogs.msdn.com/b/adonet/archive/2008/11/25/working-with-large-models-in-entity-framework-part-1.aspx –

+0

BrokerNameは、 BrokerNo.Name –

+0

はい、同じデータベースサーバーであるがデータベースが異なります。 –

関連する問題