EF - problem z napisaniem zapytania

0

Powiedzmy, że mam tabele z kategoriami i postami użytkowników. Jak za jednym zapytaniem pobrać daną kategorię i posty, które zostały napisane przez danego użytkownika w danej kategorii? Nie chcę pobierać wszystkich postów, jedynie te napisanego przez danego użytkownika. Dane o kategorii są mi potrzebne. Chodzi mi o coś takiego:

var categoryWithUserPosts = await query;
var userPosts = categoryWithUserPosts.Posts;

Encja Category ma navigation property Posts. W Include mogę podać jedynie prostą lambdę c => c.Posts, podanie czegoś bardziej skomplikowanego kończy się błędem. Myślę, że trzeba zrobić coś z Join.

0
var dupa = query.Select(x => new {
  Category = x,
  Posts = x.Posts.Where(y => y.CreatedById == userId).ToList(),
});

Coś takiego przejdzie?
UPDATE:
Dopisałem ToList, nie wiem czy bez tego przejdzie

1

Masz chyba źle zamodelowane to. Użytkownik powinien mieć posty, a post kategorię. Kategoria to kategoria, nie powinna mieć kolekcji postów.

Wtedy zaczynając od użytkownika, bierzesz go razem z postami (przy użyciu Include) i na tych postach wykonujesz filtrowanie. Wszystko w ramach jednego zapytania.

EF:
https://docs.microsoft.com/en-us/ef/ef6/querying/related-data

EF Core:
https://docs.microsoft.com/en-us/ef/core/querying/related-data

0

@Aventus: Masz na myśli coś takiego? Include(c => c.Posts.Where(p => p.CreatedById == userId))? Wtedy pojawia się błąd The expression should represent a property access: 't => t.MyProperty'

1

Zakladajac strukture podana wyzej przeze mnie:

context.Users
    .Where(u => u.Id == userId)
    .Include(u => u.Posts)
    .SelectMany(u => u.Posts)
    .Where(p => p.Category == postCategory);// To juz filtrujemy i zwracamy posty

EDIT
Jesli kategoria jest rowniez obiektem, to nalezy uzyc ThenInclude:

context.Users
    .Where(u => u.Id == userId)
    .Include(u => u.Posts)
        .ThenInclude(p => p.Category)
    .SelectMany(u => u.Posts)
    .Where(p => p.Category == postCategory);// To juz filtrujemy i zwracamy posty

Visual Studio moze wskazywac zle podpowiedzi w Code Completion, jest to znany bug w obecnej wersji. Zgodnie z dokumentacja:

Current versions of Visual Studio offer incorrect code completion options and can cause correct expressions to be flagged with syntax errors when using the ThenInclude method after a collection navigation property. This is a symptom of an IntelliSense bug tracked at https://github.com/dotnet/roslyn/issues/8237. It is safe to ignore these spurious syntax errors as long as the code is correct and can be compiled successfully.

0

Na logikę post ma User i Kategorię. Skoro chcesz pobrać posty usera w danej karegorii to wystarczy:

var result=db.Posts.Include(c=>c.Category).Where(p=>p.UserId==userId && p.CategoryId==categoryId).ToList()
0

Ok, tylko że dalej nie rozwiązuje to problemu. Chodzi mi o coś takiego: jak pobrać rodzica z tylko tymi dziećmi, które spełniają dany warunek.

1

Nie jestem pewny czy cos takiego jest mozliwe w natywnym EF na dzien dzisiejszy. Ale jest biblioteka EF Plus ktora posiada InclueWhere.

0

Ciekawie wygląda ten EF Plus (wspiera też Core). Tylko że pierwszy raz o nim słyszę. Dlaczego ludzie używają "czystego" EF zamiast niego? Ciekaw jestem, co o nim sądzi @somekind ;p

1

To jest uzupełnienie EF a nie jego zastąpienie. Somekind jest dogmatycznym kaznodzieją kościoła hejterów Entity Framework, także wiesz... ;)

Tutaj opis ze strony EF Plus:
Entity Framework Plus is the free library powered by Entity Framework Extensions. It extends EF with must-haves missing features.

2

To czasem nie jest artykuł właśnie somekind'a? Co sądzę? Już parę razy mieliśmy przyjemność dyskutować z somekind na temat EF. Nie zgadzamy się w tej kwestii i tyle. Ogólnie nie zgadzam się z podejściem w stylu X jest fe, użyj Y. W kwestii EF vs NHibernate niech każdy używa co mu wygodnie. Zawsze znajdzie się coś co będzie przemawiać na korzyść jednej opcji nad drugą. A warto pamiętać też o rozważeniu innych opcji. Czy temat przechodzi z tego jak napisać zapytanie do tego czy używać EF w ogóle? Jeśli tak, to odpowiedź już podałem. :)

1
nobody01 napisał(a):

Ciekawie wygląda ten EF Plus (wspiera też Core). Tylko że pierwszy raz o nim słyszę. Dlaczego ludzie używają "czystego" EF zamiast niego? Ciekaw jestem, co o nim sądzi @somekind ;p

Pierwszy raz o tej bilbliotece przeczytałem tutaj. Z tego co widzę, to to po prostu jest proteza podstawowych funkcji, które ORM powinien mieć wbudowane. Ale nie wszystkich, nie na każdą platformę, no i ogólnie działa słabo. Jak ktoś ma w projekcie EF, to ten EFPlus może być przydatny. Tylko to jest leczenie objawów, a nie przyczyny.
Ja generalnie jestem zdania, że narzędzia są po to, żeby pomagać w rozwiązywaniu problemów, a nie dokładać nowe. Jeszcze nie widziałem budowlańca, który wolałby wiercić dziury w ścianach śrubokrętem zamiast wiertarki. Tylko w IT wszystko działa odwrotnie, więc dla niektórych im gorsze narzędzie tym większa satysfakcja z pracy. No, ale cóż, są ludzie, którzy sobie wbijają gwoździe w ciało, więc z programistami EF chyba jeszcze nie jest tak źle (chociaż to pewnie następny etap).
No bo po co używać ORMa, który nie jest prostszy ani w instalacji, ani w użyciu, prostych rzeczy nie potrafi zrobić sam i wymaga do datków, jest zabugowany i do tego generuje koszmarny SQL? To trochę tak, jakby w tej samej cenie móc kupić starego poloneza i nowego mercedesa, i wybrać to pierwsze.

Aventus napisał(a):

To jest uzupełnienie EF a nie jego zastąpienie. Somekind jest dogmatycznym kaznodzieją kościoła hejterów Entity Framework, także wiesz... ;)

Ja swoją krytykę opieram na faktach, hejtem może ona być co najwyżej w odczuciu fanbojów.

Aventus napisał(a):

W kwestii EF vs NHibernate niech każdy używa co mu wygodnie. Zawsze znajdzie się coś co będzie przemawiać na korzyść jednej opcji nad drugą.

W takim razie jaki jest chociaż jeden technicznie merytoryczny argument za używaniem EF? (Przykłady argumentów niemerytorycznych: bo to od Microsoftu, bo to lubię, bo to było w projekcie, bo zawsze tak robiłem.)

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