Szybkie wyciągnięcie elementu z listy

0

Witajcie,

Posiadam zbiór danych typu IEnumerable<'a> gdzie a to typ anonimowy zawierający kilka właściwości, dla uproszczenia niech to będą trzy wartości - Id , Name , Value. Dane są zapisane w zbiorze o nazwie "data". Na początku była to lista, ale pakowanie elementów do niej zajmowało bardzo dużo czasu i zrezygnowałem z niej.

Zapisane jest w nim bardzo dużo elementów i niestety wykonywanie operacji na tym zbiorze trwa bardzo długo.

Przykładowo , kiedy wykonam operację:

var query = (from x in data where x.Id == 20500 select x);

Zapytanie wykonuje się bardzo szybko a "query" posiada tylko jeden element o Id = 20500. Problem zaczyna się kiedy chcę wykonać operację na tym jednym obiekcie, nawet proste wypisanie na ekranie którejś z wartości:

MessageBox.Show(query.ElementAt(0).Name.ToString());

W query znajduje się tylko jeden element, dlatego zastanawiam się dlaczego operacja wypisania trwa to tak długo (około 15 sekund). Czy możecie pomóc mi w znalezieniu sposobu na to, żebym mógł w "sprawny" sposób poruszać się po tym zbiorze danych? Z góry dzięki za odpowiedzi.

1

a słyszałeś kiedyś o tym że zapytania LINQ mają odroczone wykonanie :P? Twoje zapytanie jest wykonywane dopiero w tej drugiej linijce dlatego to tak długo trwa.
Jeśli masz dużo elementów na tej liście, i zawsze wyszukujesz po id, to użyj struktury danych która będzie miała lepszy czas wyszukiwania niż lista, np słownika.

0

No właśnie nie do końca po samym ID... Ta "kolekcja" to zbiór typów anonimowych, które są generowane z tabeli bazy danych. Za pomocą LINQ to SQL przekształcam je następującą kolekcję:

public System.Data.Linq.Table<product> {}

Powyższy przykład podałem w uproszczonej formie. Dostęp do elementu nr 20500 trwa około 15 sekund, ale aż się boję pomyśleć ile na przykład zajmie przesortowanie tego zbioru i wyciągnięcie z niego Last()'a...

0

A to nie możesz z dopytać bazy danych bezpośrednio?

0

W jakim sensie bezpośrednio? Mógłbyś wyjaśnić? Rzutuję tabele z SQLa na obiekty i to na nich wykonuję operację.

0

@polgol: Linq linqowi nierówny. Jeżeli używasz Linq to SQL to typem kolekcji nie jest IEnumerable tylko IQueryable no i co za tym idzie te Twoje zapytanie LINQ zostanie przekształcone na zapytanie do bazy danych. Skoro twierdzisz, że wyszukiwanie elementu zajmuje Ci aż 15 s to myślę, że nieźle tam w tym kodzie namieszałeś. Może robisz tak, że najpierw pobierasz całą tabelę do pamięci a dopiero potem używasz LINQ to Object w celu znalezienia tego elementu ale to jest bardzo niepoprawne. Pokaż dokładnie ten Twój kod czyli zapytanie i jakiego typu są te kolekcje dla których piszesz te zapytanie.

1

A czemu wybierasz pojedynczą wartość za pomocą jakiegoś from where zamiast po prostu Single?

Mimo wszystko 15 sekund jak na dostęp do jednej wartości to bardzo długo. Co to za baza danych? Jest indeks na ID? Jesteś pewien, że to 15 sekund to pobieranie danych, a nie np. ich wyświetlanie już po stronie aplikacji?

0

Pobieraj konkretny rekord z bazy danych, który potrzebujesz i nie będziesz miał problemów.

0

Ogarnąłem , dzięki za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1