0

我正在编写一个 LINQ 查询,它的性能比从数据库中获取要慢得多。你能告诉我如何提高性能吗?

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

这里 cmbMedicines 是一个 Combobox 和 Lookup.Medicines 是药品列表,它有大约 100K 条记录。

4

4 回答 4

2

尝试这个 :

var selectedVal = cmbType.SelectedValue.ToString();
cmbMedicines.DataSource = Lookup.Medicines.AsParallel()
      .Where(d => d.DosageForm.Equals(selectedVal)).ToList();
于 2013-11-10T04:47:45.710 回答
1

更多信息会很有用。我想知道的一件事是“Equals”调用。首先 DosageForm 是一个字符串吗?我想知道您是否在 Linq 语句之外创建了一个字符串是否会更快。例如(假设 DosageForm 是字符串):

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

此外,我认为 DataSource 将接受和 IEnumerable,因此如果您删除“.ToList()”,您可能会节省大量时间(如果查询返回丢失的内容)。

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

于 2013-11-10T04:46:46.183 回答
0

尽管我很喜欢 linq,但它并不是所有人类问题的解决方案……为什么要在内存中拥有 100K 个对象,这样你就可以对它们进行 linq,如果你可以将它们放在数据库中,然后查询数据库以得到结果?

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

于 2013-11-10T04:24:31.727 回答
0

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

我假设您的用户应该知道他们想要选择哪种药物,这样他们就可以在搜索框中输入部分药物名称。这只是一个选择,当用户在列表中输入要搜索的单词时,您可以使用带有AutoComplete的 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();
}

我希望这将有所帮助。

于 2013-11-10T06:05:07.763 回答