Ich verwende liebend gerne das Entity Framework.
Im Wesentlichen baut man seine Klassen so auf, dass eine Klasse einer Tabelle in der
DB entspricht. Das genaue
DBMS ist dabei zweitrangig (aber nicht ganz unwichtig)
Nun hat man einen DataContext (= Datenbankschema) auf das man Abfragen durchführen kann.
Joins, Where-Einschränkungen und Spaltenauswahl wird dabei im Code definiert, die
SQL wird generiert und an die Datenbank weitergereicht. Zurück kommen die Klassen, die man den Tabellen zugeordnet hat. Die Datenbank hat so viele Constraints wie sinnvoll um die Datenintegrität sicherzustellen. Also explizite Foreign-Keys und Unique Indices.
Insofern ist die Datenbank eher "dumm", weil sie keine SP und Trigger enthält, aber natürlich werden Joins in der Datenbank abgewickelt.
Beispiel:
Code:
public IQueryable<Bar> FilteredBars(int user)
{
return from bar in Bars
join foo in Foos on bar.ID equals foo.ID
where foo.List == null || foo.List.Items.Any(item => item.UserID == user)
select bar;
}