2009-04-02 2 views
2

Also im Grunde habe ich eine Anwendung, die mit nur einem Benutzer funktioniert, aber ich möchte es Multi-User machen. Dies würde bedeuten, dass ich einen Benutzer anmelde und die Benutzer-ID in der Sitzung belasse sowie eine Benutzer-ID-Spalte zu meinen Datenbanktabellen hinzufüge. keine große Sache.Datenkontext. Gibt es eine einzige Methode, wo ich ein zusätzliches WHERE hinzufügen kann?

Ich mag würde mein dbml zu ändern, oder verwenden Sie es teilweise ist, so dass jede Abfrage, die ich auch

durch sie werfen bekommt
.WHERE(user=>user.id=MYPARAM) 

ihm zugegebene angemeldet zurückzukehren nur Datensätze für Benutzer.

Gibt es einen schnellen Sieg zu haben? Ein einzelner Ort, an dem ich dies in der .dbml angeben kann?

Antwort

1

Ich würde vielleicht einen Lambda-Ausdruck dynamisch erstellen.

Die Where-Klausel ein Objekt vom Typ Expression nimmt>

Sie können dann einen Ausdruck erstellen die folgende verwenden.

Expression<Func<User,bool>> func = null; 

Dann

ParameterExpression xParam = Expression.Parameter(typeof(User), "u"); 

Sie würden dann einen Ausdruck für u.id = "test" unter Verwendung eines binären Ausdruck erstellen.

BinaryExpression uidTest = Expression.Equal(Expression.Property(xParam, "id"), 
                   Expression.Constant("test"); 

und dann auf die Expression Befestigung wie folgt:

func = Expression.Lambda<Func<User, bool>>(uidTest, xParam) 

In der Tat dies ein Lambda-Ausdruck baut u => u.id = "test"

Das Objekt func kann dann in der .Where wie folgt verwendet werden: .Where (func)

Offensichtlich können Sie dies dynamisch zu allen Kriterien erstellen, die Sie jederzeit in Ihrer Anwendung benötigen.

0

Ich bin mir nicht sicher, ob es so etwas gibt.

Wenn nicht, können Sie bereits gefilterte Eigenschaften für alle Tabellen in der partiellen Klasse verfügbar machen. Sie erhalten dann die Benutzer-ID als Parameter für den Datenkontext.

Sie können das mit einem dynamischen Ausdruck kombinieren, damit diese Eigenschaften so einfach wie möglich definiert werden können.

0

Wenn Sie weiterhin Probleme bei der Implementierung dieser Funktionalität mit LINQ to SQL haben, möchten Sie das Problem möglicherweise auf Datenbankebene lösen, indem Sie die Sicherheit auf Zeilenebene verwenden. Im Grunde könnte man jeden Tisch mit Blick wickelt, die ein dynamisches Prädikat implementiert:

WHERE user_id = SUSER_SNAME()

Diese SieFormal dynamisch erfordern jeden Benutzer Verbindungseigenschaften auf, bevor eine Verbindung zur Datenbank hergestellt wird (dh jeden Datenbankbenutzer hat einen spezifischen SQL-Benutzernamen und ein Passwort). Wenn dies keine praktikable Lösung ist, sollten Sie in Betracht ziehen, ein Framework um den L2S-Kontext zu erstellen, damit Sie Ihre eigene Logik einbringen können. Wenn Sie weitere Inspiration wünschen, haben Sie hier gelesen: http://www.west-wind.com/WebLog/posts/160237.aspx

Verwandte Themen