2010-08-11 8 views
5

Ich möchte eine E-Mail an alle Benutzer senden, wo ihr Geburtstag ist heuteASP.NET Mitgliedschaft Profil

Ich benutze die integrierte asp.net (3.5) Mitgliedschaft. Alle Benutzer verfügen über ein Profil (in aspnet_Profile gespeichert), das eine Datums-/Uhrzeiteigenschaft mit dem Namen "birthday" enthält. Ich muss eine Liste der E-Mail-Adressen der Benutzer aus der Tabelle "aspnet_Membership" abrufen, in der sich der Geburtstag eines Benutzers befindet, zusammen mit dem Vornamen des Benutzers, bei dem es sich um eine string-Eigenschaft in der Tabelle aspnet_Profile handelt.

Ich möchte eine Liste vorzugsweise mit C# LINQ zurückgegeben.

Ich bin nicht sicher, wie der Geburtstag Eigenschaft in der Profiltabelle zuzugreifen, basierend auf die Art und Weise sie in der Tabelle db dh Name/Wert-Spalt gespeichert

Antwort

3

ich glaube, Sie an den stark verbesserten Wechsel in Betracht ziehen sollten Tabelle basierten Anbieter:

http://weblogs.asp.net/scottgu/archive/2006/01/10/435038.aspx

auf diese Weise können Sie Ihre Daten in einen Wert pro Spalte der Tabelle in der Standard-SQL Art und Weise trennen. Dies führt petter als der Standardanbieter und löst Ihr Problem der Abfrage der Profile-Datenbank.

Es wird ein wenig Arbeit in Anspruch nehmen, um die Datenbank zu konvertieren, aber auf der Codepage ist es nur eine Frage der Konfiguration in einem anderen Anbieter und nichts anderes sollte sich ändern. Das ist die Schönheit des Providermusters.

+0

danke @Daniel Ich wusste nicht einmal von diesem Anbieter, wird sicherlich diese vorwärts gehen! –

+0

Gern geschehen. –

0

ich Sie nicht genug verwenden LINQ eine gute Antwort zu geben, aber die folgenden die zugrunde liegende SQL Sie müssen sein (Dies ist, wie meine SSMS es in dem Abfrage-Designer generiert): Die

SELECT  aspnet_Profile.PropertyValuesString AS firstname, aspnet_Membership.Email 
FROM   aspnet_Profile INNER JOIN 
         aspnet_Membership ON aspnet_Profile.UserId = aspnet_Membership.UserId INNER JOIN 
         aspnet_Profile AS aspnet_Profile_1 ON aspnet_Profile.UserId = aspnet_Profile_1.UserId 
WHERE  (aspnet_Profile_1.PropertyNames LIKE N'birthday') AND (aspnet_Profile.PropertyNames LIKE N'firstname') AND (DATEADD(dd, 0, DATEDIFF(dd, 0, 
         aspnet_Profile_1.PropertyValuesString)) = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))) 
0

Der Profilmechanismus analysiert die Werte, indem er jedes Name/Wert-Paar aufteilt und dann einzeln analysiert. Sie könnten Code schreiben, um das selbst zu tun. Oder Sie könnten @ Daniels Ansatz verfolgen und den alternativen Anbieter nutzen, der Ihnen das Leben erleichtert. Der Out-of-the-Box-Anbieter hat Probleme mit der String-Verkettung.

Ist dieser Code in der gleichen App? Sie könnten einfach das Profil-Objekt verwenden, um es abzurufen, wenn Sie C# sprechen ... welcher Kontext ist dieser Codeabschnitt? Batch-Service?