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

C# 提示中dblinq结果与sql查询的速度差异,c#,join,dblinq,C#,Join,Dblinq,我已经设置了一个与dblinq一起使用的数据库 CREATE TABLE 'quotes' ( 'DBDate' int(8) unsigned NOT NULL,

我已经设置了一个与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查询时,所以不是与服务器相同的机器

从引号a中选择a.*,b.*,在a.DBDate上的内部联接引号b= b、 DBDate和a.TICKRID=956和b.TICKRID=957由a.DBDate asc订购

我将获得预期的输出: 组中2934行0.03秒

但当我想在我的C环境中使用DBLinq获得相同的结果时,如下所示:

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是否应该将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表达式中调用.AsEnumerable对它们进行计算。将结果移动到内存中,然后Linq将对象连接到内存中,这可能会很昂贵。然后在内存中订购剩余的项目


上面的内容应该允许您将所有这些步骤传递给查询提供程序,而查询提供程序往往要快得多。

有趣的是,我实际上有一个像您建议的那样的linq查询,但我收到一条错误消息,a和b的类型不匹配或类似的情况。我明天会把确切的消息发出去。。这就是为什么我将其分为两个独立的查询,并在第三个查询中加入它们。明天我将测试您的查询,如果有问题,请告诉您。谢谢你的回复。好的,我在我的笔记本电脑上测试了你的查询。当我使用split方法时,将其放入列表大约需要750毫秒,它的大小是上一次测试的一半,长度为1358行。但是,当我按照您的建议使用查询时,大约需要3分23秒,并返回2763418行。它不能正确地处理a.DbdAte等于b.DbdAte。我不明白为什么…有什么建议吗?@user369122听起来有点不对劲。。。DbdAte是什么类型的?大写字母很难说,但我假设这是一个日期?它不是无符号整数。但是,为什么正常连接速度要慢得多…为什么它返回那么多行?join和equals有点不对劲,不是吗?我已经读了一遍又一遍了,虽然我现在喝了一两杯啤酒,但看不出你们的结果会是怎样的。您的3个表达式应该生成2个数据库查询,其余的操作都在内存中,而我的表达式应该生成1个数据库查询,并且没有实际的内存工作。你确定你都打对了吗?绝对不再使用AsEnumerable了?