2013-11-10 25 views
0

我正在写一个LINQ查询,其性能比从数据库中获取要慢得多。你能否介绍一下如何提高性能?Linq性能问题与巨大的记录集

cmbMedicines.DataSource = Lookup.Medicines 
     .Where(d => d.DosageForm.Equals(cmbType.SelectedValue.ToString())) 
     .AsParallel().ToList(); 

这里cmbMedicines是Combobox和Lookup.Medicines是药品清单,它有大约100K记录。

+0

附注:我认为[lakh](http://en.wikipedia.org/wiki/Lakh)用作100.000 ...随意编辑,如果我的更改是错误的... –

+0

什么是“ AsParallel'在这里? “Lookup.Medicines”是一个可查询的界面吗? – Matthew

+0

'AsParallel'在这里没有任何意义。 – MarcinJuraszek

回答

0

尽管我爱linq,但它不是解决所有人类问题的方法...... 为什么你想在内存中有100K对象,所以你可以将它们绑定,如果你可以把它们放在数据库中,只是查询数据库以获得结果?

使用数据库,因为它是应该被使用,并且使用LINQ,因为它本来是要用来...

1

更多信息将是有益的。我想知道的一件事是“Equals”电话。首先是DosageForm一个字符串?我不知道你是否在Linq声明之外创建了一个字符串,如果它会更快。例如(假设DosageForm是字符串):

var val = cmbType.SelectedValue.ToString(); 
cmbMedicines.DataSource = Lookup.Medicines 
      .Where(d => d.DosageForm == val)) 
      .ToList(); 

而且我认为,数据源将接受和IEnumerable,所以如果你去掉“.ToList()”,你可能会节省大量的时间(如果该查询返回失去了东西)。

SQL服务器针对这类事情进行了高度优化,所以根据传输数据所需的开销,它可能难以打败。

+0

数据源不接受IEnumerable。它给出了例外。 – techknackblogs

+0

和DosageForm是一个字符串。 – techknackblogs

+0

抱歉错误必须误解DataSource接受IEnumerable。其他建议是否有帮助? – Dweeberly

2

试试这个:

var selectedVal = cmbType.SelectedValue.ToString(); 
cmbMedicines.DataSource = Lookup.Medicines.AsParallel() 
     .Where(d => d.DosageForm.Equals(selectedVal)).ToList(); 
0

我觉得对ComboBox数据绑定过程中也降低了性能。 如果可能,你应该使用其他控件而不是Combobox来处理大数据。

我假设你的用户应该知道他们想选择哪种药物,所以他们可以在搜索框中放入一部分药物名称。这只是一个选择,您可以使用TextBox(名称txtMedicines在我的示例代码中)与AutoComplete来搜索绑定数据,当用户输入某个单词在列表中进行搜索时。

这是一个示例代码

private void InitializeMedicinesAutoComplete() 
{ 
    var searchMed = Lookup.Medicines 
     .Where(d => d.DosageForm.Equals(cmbType.SelectedValue.ToString())).ToList(); 

    var source = new AutoCompleteStringCollection(); 
    foreach (var med in searchMed) 
    { 
     // **DisplayMemberText mean any field that you want to display in searching list 
     source.Add(med.DisplayMemberText); 
    } 
    txtMedicines.AutoCompleteMode = AutoCompleteMode.Suggest; 
    txtMedicines.AutoCompleteSource = AutoCompleteSource.CustomSource; 
    txtMedicines.AutoCompleteCustomSource = source; 
} 

private void cmbType_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    InitializeMedicinesAutoComplete(); 
} 

我希望这将有助于。