LINQ - odpowiednik SELECT WHERE

Newb
2012-09-17 13:32
Newb
0

Napisałem taki działający kodzik:

List<book> books = db.Books.ToList<book>();
foreach(var book in books) {
if (book.CategoryID != CategoryID)
books.Remove(book);
}



Zmienna db to mój kontekst bazy danych w Entity Framework. Jak widać pobieram wszystko i usuwam czego nie chcę. Przy dużej ilości wpisów byłoby to mocno nieoptymalne. Jak pobrać tylko te elementy króre mają konkretną wartość pola np. CategoryID?

Pozostało 580 znaków

Newb
2012-09-17 13:38
Newb
0

Spróbuje tak:
http://dotnet.dzone.com/articles/get-last-n-records-using-linq

Pozostało 580 znaków

emfałsi
2012-09-17 13:45
emfałsi
0
Newb napisał(a):

Napisałem taki działający kodzik:

List<book> books = db.Books.ToList<book>();
foreach(var book in books) {
if (book.CategoryID != CategoryID)
books.Remove(book);
}



Zmienna db to mój kontekst bazy danych w Entity Framework. Jak widać pobieram wszystko i usuwam czego nie chcę. Przy dużej ilości wpisów byłoby to mocno nieoptymalne. Jak pobrać tylko te elementy króre mają konkretną wartość pola np. CategoryID?


var _id = 123;
List<book> books = db.Books.Where(b=>b.CategoryID == _id).ToList<book>();



Pierwsza lepsza strona Google'a, szkoda miejsca w bazie danych na Twojego posta, ale widać dupę ciężko ruszyć.
edytowany 1x, ostatnio: msm, 2016-12-13 18:26

Pozostało 580 znaków

2012-09-17 13:50

Rejestracja: 8 lat temu

Ostatnio: 5 godzin temu

0

Ten kod który umieściłeś nie powinien działać, gdyż nie można zmieniać kolekcji po której iterujesz przez foreach.
Oprócz często stosowanego zapytania linqu z postu wyżej możesz też tak:

   List<Book> books = db.Books.ToList<Book>();
   books.RemoveAll(book=>book.CategoryID != CategoryID);

Jednakże moim zdaniem powinieneś odfiltrować to na poziomie zapytania. Nie znam niestety Entinity (pracuję na nHibernate)

edytowany 2x, ostatnio: Sarrus, 2012-09-17 13:54

Pozostało 580 znaków

2012-09-17 14:37

Rejestracja: 9 lat temu

Ostatnio: 6 lat temu

Z tego co pamiętam, można to też zapisać w stylu:

 var result = from b in books where b.CategoryID != 123 select b;

"Robienie w Javie moge porównac do spuszczania wody w kiblu za pomoca wiadra z wodą przyniesioną ze studni zza 7 gór, którą się dodatkowo samemu wykopało łyżeczką do słodzenia herbaty."
Pokaż pozostałe 5 komentarzy
możesz też zamiast pisać while rozpisać to sobie na continuation-passing, ale nie rozumiem do czego zmierzamy. Foreach był od początku i przypomina inne konstrukcje z rodziny C, from, in, where, select i jeszcze kilkanaście podobnych keywordów zostało sztucznie dorzuconych do C# 3.0 i nie pasują do niczego. A extension methods nie psują składni i nie są tak magicznie traktowane przez kompilator. - msm 2012-09-18 19:52
no właśnie zmierzam do tego, że wcale nie są sztuczne i czasem są wygodniejsze. to tylko kwestia notacji i tyle. a ganienie kogoś za to, że pisze inaczej jest moim zdaniem trochę nie na miejscu. - dam1en 2012-09-18 19:57
ale fakt faktem, że rozmowa nie wnosi niczego do wątku - dam1en 2012-09-18 19:59
Dlatego dobrze, że nic nie wnosząca rozmowa odbywa się w komentarzach. ;) Notacja metodowa jest moim zdaniem czytelniejsza i bardziej intuicyjna dla kogoś, kto programuje od wielu lat. Początkującemu, może to nie robić w sumie różnicy, chociaż ma dzięki temu kilkanaście dodatkowych słów kluczowych do nauczenia. Zaś sam C# przez ten nadmiar słów kluczowych, które nie dają żadnej wartości dodanej robi się językiem spuchniętym, niedługo zacznie przypominać VB. - somekind 2012-09-18 20:26
Notacja metodowa ma też tę zaletę, że korzystanie z niej wygląda podobnie do korzystania z różnych innych mechanizmów opartych na metodach rozszerzających, np. QueryOver w NHibernate. Pisanie raz przez metody (bo nie da się inaczej), a raz z użyciem magicznych słówek nie wygląda ładnie. - somekind 2012-09-18 20:27

Pozostało 580 znaków

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