2013-12-19 65 views
1
var data= (from a in context.Table1 
       where a.Id== id 
       select a); 
    return data.ToList(); 

我在wpf项目中有上面的linq查询。上面的查询从SQLite数据库中获取大约0.2-0.3百万行。取数据的结果很快,但是在执行data.ToList()的同时,由于没有使用数据库,所以需要很多时间。的行,因此我的用户界面等待15-20秒来查看结果。我应该如何着手解决这个问题。另外,如果上面的表包含外键然后在访问子元素时抛出ObjectDisposeedException。我想它是由于延迟加载,所以我试图明确设置子元素。它的工作,但后来我的过程变得更慢Linq Query非常慢

+0

请告诉我们你以后如何使用数据。你绑定他们做一个cotnro?什么类型的cotnrol?谢谢 – Christos

+0

一种情况是我需要在图表中显示所有数据,另一种情况就像是取平均值等。我没有将它绑定到控件上,我做了一些计算,并将计算结果绑定到基本控件,如文本块等 – androider

+0

如何将数据显示到图表中?你是否将查询的结果设置为图表的数据源?请张贴我们这部分代码。看看绑定是如何发生是非常重要的,以避免查询的.ToList(),如果可能的话。 – Christos

回答

2

当然LINQ命令“执行”在任何时候,下面只是代表查询。

var data= (from a in context.Table1 
       where a.Id== id 
       select a); 

查询,一旦你遍历它作为return data.ToList();这正是ToList方法做什么时,才会执行。

我建议您在寻呼机中使用SkipTake运算符来缩小从数据库查询的结果的范围。这样做,你只需要10或20个元素,或者你需要的任何东西,从而获得更平滑的体验。

做分页必将优化您的检索性能也..

+0

同意。不要在UI中放置0.3百万行。分页。 – jlvaquero

+0

事情是没有分页,例如:可以说我想要显示图表中的所有数据,所以我需要一次去所有的数据,那么我应该如何继续获得顺畅的体验? – androider

+0

@yshooooo你正在使用什么类型的图表控件?你没有在你的问题中提到它..请提及所有可能的信息,因为这肯定会帮助我们给你一个正确的,有生产力的答案。 – Usman

0

之前使用“.ToList()”的意思是你的代码仍然在模式‘的IQueryable’,并使用” .ToList时() “意味着你访问物理数据库。 您可以在LINQ上以“.Take(x)”和“.Page(y)”的方式获取一些数据。你可以尝试这种方法:

int page = 1; 
int size = 10 
var customers = tx.Customers 
       .Where(x => x.....) 
       .Skip((page - 1) * 10).Take(size) 
       .ToList();