2013-11-10 2 views
0

LINQ 쿼리를 작성 중이며 성능이 DB에서 가져 오는 것보다 훨씬 느립니다. 어떻게 성능을 향상시킬 수 있는지 몇 가지 생각해 주시겠습니까? 여기거대한 레코드 집합의 Linq 성능 문제

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

cmbMedicines는 콤보 상자와 Lookup.Medicines는 의약품의 목록이며 주위 100K 기록을 가지고있다.

+0

사이드 노트 : 나는 [lakh] (http://en.wikipedia.org/wiki/Lakh)이 100.000으로 사용된다고 생각합니다 ... 내 변경이 잘못되어도 언제든지 편집 할 수 있습니다 ... –

+0

' AsParallel은 여기서 뭐하는거야? 'Lookup.Medicines'은 질의 가능한 인터페이스입니까? – Matthew

+0

'AsParallel'은 여기에 아무런 의미가 없습니다. – MarcinJuraszek

답변

0

linq을 사랑하는만큼, 그것은 모든 인류 문제에 대한 해결책이 아닙니다 ... 당신은 데이터베이스에 가질 수 있다면, 당신은 그들을 linq 수 있도록 메모리에 100K 개체를 왜 갖고 싶은가요 그냥 결과를 얻기 위해 데이터베이스를 쿼리?

이 사용했는데 그것을 사용하는 가정되었을 때 데이터베이스를 사용하고, 사용 LINQ ...

1

더 많은 정보는 유용 할 것이다. 내가 궁금해하는 한가지는 "동등한"호출이다. 첫째로 DosageForm이 문자열입니까? 더 빨라진다면 Linq 문 밖에서 문자열을 생성했는지 궁금합니다. 또한

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

난 당신이 조회가를 반환하는 경우는 ".ToList()가"당신이 (많은 시간을 절약 할 수있는 드롭 그래서 만약 데이터 소스가 IEnumerable을 받아 것이라고 생각 예를 들어 (DosageForm을 가정 할 문자열입니다) 잃어버린 물건).

SQL 서버는 이러한 종류의 작업에 고도로 최적화되어 있으므로 데이터 전송에 필요한 오버 헤드에 따라 어려울 수 있습니다.

+0

데이터 소스는 IEnumerable을 허용하지 않습니다. 그것은 예외를 제공합니다. – techknackblogs

+0

이고 DosageForm은 문자열입니다. – techknackblogs

+0

죄송합니다. IEnumerable을 수락하는 DataSource에 대해 잘못 알고 있어야합니다. 다른 제안이 도움이 되었습니까? – Dweeberly

2

이 시도 :

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

내가 콤보 상자 데이터 바인딩 과정도 성능이 저하 될 것이라고 생각합니다. 가능하면 큰 데이터를 처리하기 위해 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(); 
} 

입니다.