2010-08-11 33 views
5

Quiero enviar un correo electrónico a todos los usuarios donde su cumpleaños es hoyPerfil de membresía de ASP.NET

Estoy usando la membresía integrada asp.net (3.5). Todos los usuarios tienen un perfil (almacenado en aspnet_Profile) que contiene una propiedad de fecha/hora llamada 'cumpleaños'. Necesito obtener una lista de las direcciones de correo electrónico de los usuarios de la tabla 'aspnet_Membership' donde el cumpleaños de los usuarios es hoy, junto con el primer nombre de los usuarios ', que es una propiedad de cadena en la tabla aspnet_Profile.

Me gustaría una lista devuelta preferiblemente con C# LINQ.

No estoy seguro de cómo acceder a la propiedad de cumpleaños en la tabla de perfiles, en base a la forma en que se almacena en la tabla db es decir, columnas de nombre/valor

Respuesta

3

creo que usted debe considerar el cambio a la muy mejorada proveedor con sede en la tabla:

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

Esto le permite separar sus datos en un valor por cada columna de la tabla en la forma estándar SQL. Esto funciona mejor que el proveedor estándar y resuelve su problema de consultar la base de datos de Perfiles.

Tomará una pequeña cantidad de trabajo para convertir la base de datos, pero por el lado del código, es solo una cuestión de configurarlo en un proveedor diferente y nada más debería cambiar. Esa es la belleza del patrón del proveedor.

+0

gracias @Daniel ¡Ni siquiera estaba al tanto de ese proveedor, sin duda usaré esto en el futuro! –

+0

De nada. –

0

No consumo LINQ suficiente para darle una buena respuesta, pero el siguiente puede ser el SQL subyacente que necesita (Así es como mi SSMS generado en el diseñador de consultas):

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

El El mecanismo de perfil analiza los valores dividiendo cada par de nombre/valor y luego analizándolos individualmente. Podrías escribir código para hacerlo tú mismo. O puede seguir el enfoque de @ Daniel y usar el proveedor alternativo, que hace la vida más fácil. El proveedor out-of-the-box es un problema con la concatenación de cadenas.

¿Este código está en la misma aplicación? Podrías simplemente usar el objeto de perfil para recuperarlo, si estás hablando de C# ... ¿en qué contexto está esta pieza de código? ¿Servicio por lotes?

Cuestiones relacionadas