0

dblinq で使用するデータベースをセットアップしました。

CREATE TABLE 'quotes' (                                                                                                      
      'DBDate' int(8) unsigned NOT NULL,                                                                                         
      'TickerID' int(11) unsigned NOT NULL,                                                                                      
      'Open' double(12,4) NOT NULL,                                                                                              
      'High' double(12,4) DEFAULT NULL,                                                                                          
      'Low' double(12,4) DEFAULT NULL,                                                                                           
      'Close' double(12,4) DEFAULT NULL,                                                                                         
      'AdjClose' double(12,4) DEFAULT NULL,                                                                                      
      'Volume' int(11) unsigned NOT NULL,                                                                                        
      PRIMARY KEY ('TickerID','DBDate'),                                                                                         
      CONSTRAINT 'quotes_ibfk_1' FOREIGN KEY ('TickerID') REFERENCES 'tickers' ('TickerID') ON DELETE CASCADE ON UPDATE CASCADE  
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC             

上記は mysql テーブルのスケジュールです。MySQL サーバーは別のマシンにあります。テストマシンでこのmysqlクエリを実行すると(サーバーと同じマシンではありません)

SELECT a.*, b.* FROM は a を引用します INNER JOIN は b を引用します ON a.DBDate = b.DBDate AND a.TickerID=956 and b.TickerID=957 a.dbdate asc による順序。

期待どおりの出力が得られます: 2934 行セット (0.03 秒)

しかし、次のように DBLinq を使用して C# 環境で同じ結果を得たい場合:

var tradeAbleA = (from a in _db.Quotes where a.TickerID == 956 select a);
var tradeAbleB = (from a in _db.Quotes where a.TickerID == 957 select a);
var myDataSet = (from a in tradeAbleA.AsEnumerable() join b in tradeAbleB.AsEnumerable() on a.DbdAte equals b.DbdAte orderby a.DbdAte ascending select new { a, b }).ToList();

リストがいっぱいになるまでに 1 秒以上かかります。これは長すぎます。どうすればこれをスピードアップできますか? (リストに必要です)よろしく、

マティス

4

1 に答える 1

0

あなたの Sql は次の linq に変換されるべきではありませんか?

var myDataSet = (from a in _db.Quotes 
    join b in db.Quotes on a.DbdAte equals a.DbdAte 
    where a.TickerID == 956 && b.TickerID == 957 
    orderby a.DbdAte ascending select new { a, b }).ToList();

現在のバージョンでは、a と b のクエリを別々に作成し、.AsEnumerable()linq 式の 3 番目でそれらを呼び出すことで、それらを強制的に評価します。結果をメモリに移動すると、Linq to Objects が自動的に結合します (コストがかかる場合があります)。次に、メモリ内の残りのアイテムを注文します。

上記により、これらすべての手順をクエリ プロバイダーに渡すことができるようになります。これは、はるかに高速になる傾向があります。

于 2011-07-13T15:43:42.617 に答える