2009-06-16 4 views
3

Ein Großteil meiner Anwendung verwendet übereinstimmende Abfragen zum Abrufen von Daten. In diesen Abfragen werde ich oft auf den aktuellen Benutzer verweisen. Ich merke, dass, wenn sich ein Benutzer B nach einem anderen Benutzer anmeldet, A, dann wird Benutzer B die Informationen von Benutzer A sehen.Compilierte Abfragen Cache?

Ich habe Anfragen viel wie diese alle durch die Anwendung

public static Func<DataContext, MyRecord> CurrentUserRecords = 
      CompiledQuery.Compile<DataContext, MyRecord>(
       (DataContext db) => 
        (from r in db.MyRecords 
        where 
         r.User == User.Current 
        select r).SingleOrDefault()); 

User.Current eine statische Eigenschaft ist, die in Abhängigkeit von Änderungen, die angemeldet ist.

public static User Current 
{ 
    get { return MyBase<User>.Get((int)(HttpContext.Current.Session["CurrentUserID"] ?? 0)); } 
} 

Als ich zum ersten Mal anmelden, mit Benutzer A, die obige kompilierte Abfrage gibt die Datensätze von Benutzer A zurück. Daraus folgt, dass User.Current auch den richtigen Verweis auf Benutzer A zurückgibt. Wenn ich mich jedoch als Benutzer B anmelde, gibt die obige kompilierte Abfrage trotzdem die Datensätze von Benutzer A zurück, obwohl User.Current einen Verweis auf Benutzer B zurückgibt.

Ich habe Profiler für SQL Server ausgeführt, und bemerkte, wenn die kompilierte Abfrage ausgeführt wurde, die generierte TSQL referenzierte Benutzer A ID beide Male. diese

So ist meine Frage:

Sie irgendwie kompilierten Abfragen zwischenspeichern?

Wenn ja, was ist die Lebensdauer, und kann ich es kontrollieren?

Verweist ein "aktueller Benutzer" in einer kompilierten Abfrage bad Design für eine ASP.net-Anwendung?

Vielen Dank!

Antwort

2

Sie müssen in der kompilierten Abfrage einen Zeichenfolgenparameter zulassen. Andernfalls wird der Wert der Zeichenfolge während .Compile() aufgelöst. Versuchen Sie folgendes:

public static Func<DataContext, string, MyRecord> UserRecordByParam = 
    CompiledQuery.Compile<DataContext, string, MyRecord> 
(
    (DataContext db, string UserName) => 
    db.MyRecords.Where(r => r.User == UserName).SingleOrDefault() 
); 

public static Func<DataContext, MyRecord> CurrentUserRecord = 
    (DataContext db) => UserRecordByParam(db, User.Current); 
+0

Ich hatte davor Angst. Ich bin derzeit auf der Menge der Parameter, die die CompliledQuery.compile-Überladungen verwenden können, ausgereizt. Ich fand das aber http://social.msdn.microsoft.com/forums/en-US/adodottertentityframework/thread/f1fc5570-be6d-4d7f-b94f-aa5b6e9922cf/ –

+1

Sie sollten einen Func verwenden, und wenn Sie ausgehen der verfügbaren Parameter auf dem Func einfach ein Objekt erstellen, um alle Ihre Parameter darzustellen und diese als Eingabe an die Func übergeben. – BZink

Verwandte Themen