Linq性能问题具有巨大的记录集

时间:2013-11-10 04:00:58

标签: c# performance linq

我正在编写LINQ查询,其性能比从DB中获取要慢得多。您能否想一想如何提高性能呢?

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

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

4 个答案:

答案 0 :(得分:2)

试试这个:

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

答案 1 :(得分:1)

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

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

另外我认为DataSource将接受IEnumerable,所以如果你删除“.ToList()”,你可能会节省很多时间(如果查询返回丢失的东西)。

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

答案 2 :(得分:0)

尽管我喜欢linq,但它不是所有人类问题的解决方案...... 你为什么要在内存中有100K对象,这样你就可以使用它们,如果你可以将它们放在数据库中,只是查询数据库以获得结果?

使用应该使用的数据库,并使用应该使用的linq ......

答案 3 :(得分:0)

我认为Combobox数据绑定过程也会降低性能。 如果可能,您应该使用其他控件而不是Combobox来处理大数据。

我认为您的用户应该知道他们想要选择哪种医学,因此他们可以将一部分药物名称放在搜索框中。这只是一个选择,您可以使用TextBox(在我的示例代码中名称 txtMedicines )与自动完成来搜索绑定数据,当用户在列表中输入要搜索的单词时。

这是一个示例代码

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();
}

我希望这会有所帮助。