LINQ - odpowiednik SELECT WHERE

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?
0

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

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?


<code class="c#">
            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ć.

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)

1

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

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

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