速度差dblinq结果与提示中的sql查询

时间:2011-07-13 15:37:05

标签: c# join dblinq

我已经设置了一个与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引用INNER JOIN引号b ON a.DBDate =   b.DBDate AND a.TickerID = 956和b.TickerID = 957 by 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();

需要一秒钟的时间来填充列表。这太长了。我怎样才能加快速度呢? (我需要在列表中) 的问候,

Matthijs

1 个答案:

答案 0 :(得分: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创建查询,并通过在linq表达式的第3个中调用.AsEnumerable()来强制对它们进行求值。您将结果移动到内存中,然后Linq到Objects连接(这可能很昂贵)。然后,您可以在内存中订购剩余的项目。

以上内容应该允许您将所有这些步骤传递给查询提供程序,这些步骤往往更快