我正在编写LINQ查询,其性能比从DB中获取要慢得多。您能否想一想如何提高性能呢?
cmbMedicines.DataSource = Lookup.Medicines
.Where(d => d.DosageForm.Equals(cmbType.SelectedValue.ToString()))
.AsParallel().ToList();
这里的cmbMedicines是一个Combobox和Lookup.Medicines是药品清单,它有大约100K的记录。
答案 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();
}
我希望这会有所帮助。