2013-04-04 10 views
5

Więc mam coś takiego:Lambda: Where do listy Dołącz

var myObj = db.SomeObject 
       .Include("Tasks") 
       .SingleOrDefault(x => x.Id == someObjectId); 

if (myObj != null) 
{ 
    myObj.Tasks = myObj.Tasks.OrderBy(x => x.Number).ToList(); 
} 

Tutaj chcę, aby móc postawić warunek (where) na moim należą na przykład: .where task.IsDeleted == false

Thusfar Nie znalazłem rozwiązania.

Jestem świadomy faktu, że mogę używać where wraz z tym, gdzie zamawiam zadania, ale to jednak nie działa w bazie danych, ale zamiast tego korzysta z pamięci. Chcę, żeby działał w bazie danych.

Czy ktoś tutaj wie, jak mogę to zrobić? Jeśli tak, czy istnieje również sposób umieszczenia warunku order by na liście zadań dołączonych do zestawu?

+0

nie sądzę, że to możliwe. – MarcinJuraszek

+1

Dlaczego po prostu nie dostaniesz zadań? A następnie Tylko obiekt bez zadań? – lahsrah

+1

@sylon: co masz na myśli? – Tikkes

Odpowiedz

5

Coś takiego, przywraca oryginalny obiekt z jego kolekcją podrzędnych filtrowanych i sortowanych.

SomeObject a = db.SomeObjects.Where(x => x.Id == someobjectid) 
         .Select(
          x => 
          new 
           { 
            someObject = x, 
            task = x.Tasks.Where(task => task.IsDeleted == false) 
               .OrderBy(task => whatever) 
           }) 
         .Select(x => x.someObject).Single(); 

to faktycznie utraty zbiór działań w ostatnim wybierz więc można to zrobić:

SomeObject a = db.SomeObjects.Where(x => x.Id == someobjectid) 
         .Select(
          x => 
          new 
           { 
            someObject = x, 
            task = x.Tasks.Where(task => task.IsDeleted == false) 
               .OrderBy(task => whatever) 
           }); 
return a.FirstOrDefault().someObject; 
+0

To faktycznie działa i daje mi oryginalny obiekt. ty! – Tikkes

2

Prosta odpowiedź brzmi: Nie możesz tego zrobić.

Dlaczego? Ponieważ zapytanie dotyczy: SomeObject.
Każdy zwrócony SomeObject zawiera wszystkie dane odniesienia, ponieważ gdyby nie, nie reprezentowałby faktycznego obiektu w bazie danych.

+0

Jaki byłby lepszy sposób podejścia? ponieważ mam na przykład 1000 zadań i nie chcę ładować ich wszystkich, ponieważ, powiedzmy, 600 ma flagę 'IsDeleted' ustawioną na' true' – Tikkes

+0

@Tikkes: Myślę, że w takim przypadku potrzebujesz projekcji. [Nicholas Butler] (http://stackoverflow.com/a/15810444/572644) pokazuje przykład dla EF. –

1

Co o uzyskanie je oddzielnie:

var myObj = db.SomeObject 
       .SingleOrDefault(x => x.Id == someObjectId); 


var tasks = db.SomeObject 
       .Where(x => x.Id == someObjectId) 
       .SelectMany(x => x.Tasks) 
       .Where(x => !x.Deleted); 
5

Aby to zrobić, to EF, trzeba określić projekcję z Select klauzuli.

Coś jak to będzie tylko dane, które chcesz z DB:

var anonymous = db.SomeObject.Where(x => x.Id == someObjectId) 
    .Select(x => new 
    { 
     SomeObject = x, 
     Tasks = x.Tasks 
     .Where(o => !o.IsDeleted) 
     .OrderBy(o => ...) 
    } 
) 
    .SingleOrDefault() 
; 

skończy się z instancją anonimowego typu, ale można łatwo ustalić, że się na kliencie:

MyObject myObject = anonymous.SomeObject; 
myObject.Tasks = anonymous.Tasks; 
+0

To może zadziałać, po prostu przetestować niektóre rzeczy z tym jeszcze. – Tikkes

+0

Działa! Dziękuję Ci! – Tikkes

+1

FYi - jeśli nie chcesz zajmować się anonimowymi obiektami, możesz jawnie rzucić go do modelu w Wybierz przez. Wybierz (x => nowy YourModelClass – ejhost