2010-05-05 16 views
8

estoy utilizando LINQ consulta y llamada a un método como ..método de llamada de consulta LINQ

oPwd = objDecryptor.DecryptIt((c.Password.ToString()) 

volverá valor nulo.

Significa que esto no funcionará.

cómo resuelvo esto.

Gracias ..

var q = 
    from s in db.User 
    join c in db.EmailAccount on s.UserId equals c.UserId 
    join d in db.POPSettings 
     on c.PopSettingId equals d.POPSettingsId 
    where s.UserId == UserId && c.EmailId == EmailId 
    select new 
    { 
     oUserId = s.UserId, 
     oUserName = s.Name, 
     oEmailId = c.EmailId, 
     oEmailAccId = c.EmailAccId, 
     oPwd = objDecryptor.DecryptIt(c.Password.ToString()), 
     oServerName = d.ServerName, 
     oServerAdd = d.ServerAddress, 
     oPOPSettingId = d.POPSettingsId, 
    }; 
+3

Por cierto, la mejor práctica es simplemente no almacenar contraseñas. Ni siquiera encriptado. Solo hashed con sal. Ah, y esos nombres de propiedad son * horrible *. –

+0

Coloque un punto de interrupción dentro de DecryptIt (...) y descubra por qué está devolviendo nulo? –

Respuesta

11

Si se trata de LINQ-to-SQL o Entity Framework. Tendrá que dividirlo en pasos (ya que no puede ejecutar eso en la base de datos). Por ejemplo:

var q = from s in db.User 
     join c in db.EmailAccount on s.UserId equals c.UserId 
     join d in db.POPSettings on c.PopSettingId equals d.POPSettingsId 
     where s.UserId == UserId && c.EmailId == EmailId 
     select new 
     { 
      oUserId = s.UserId, 
      oUserName = s.Name, 
      oEmailId = c.EmailId, 
      oEmailAccId = c.EmailAccId, 
      oPwd = c.Password, 
      oServerName = d.ServerName, 
      oServerAdd = d.ServerAddress, 
      oPOPSettingId = d.POPSettingsId, 
     }; 

a continuación, utilizar AsEnumerable() romper "composición" en el almacén de back-end:

var query2 = from row in q.AsEnumerable() 
     select new 
     { 
      row.oUserId, 
      row.oUserName, 
      row.oEmailId, 
      row.oEmailAccId, 
      oPwd = objDecryptor.DecryptIt(row.oPwd), 
      row.oServerName, 
      row.oServerAdd, 
      row.oPOPSettingId 
     }; 
+0

Thahk mucho ... –

0

Esto no tiene nada acerca de consultas LINQ. necesita depurar el método objDecryptor.DecryptIt

+0

pero no puedo entrar en esta consulta de linq ... –

+1

Puede agregar punto de interrupción al método DecryptIt y verá por qué devuelve nulo. – Fedor

+0

Cuando estoy depurando en ese momento, pasa directamente a esta consulta, así que cómo llego a saber ... Pero el objDecryptor.DecryptIt está funcionando correctamente. –

1
var q = from s in db.User 
    join c in db.EmailAccount on s.UserId equals c.UserId 
    join d in db.POPSettings on c.PopSettingId equals d.POPSettingsId 
    where s.UserId == UserId && c.EmailId == EmailId 
    select new 
    { 
     oUserId = s.UserId, 
     oUserName = s.Name, 
     oEmailId = c.EmailId, 
     oEmailAccId = c.EmailAccId, 
     oPwd = c.Password, 
     oServerName = d.ServerName, 
     oServerAdd = d.ServerAddress, 
     oPOPSettingId = d.POPSettingsId, 
    }; 

foreach (var item in q) 
     { 
      item.oPwd = objDecryptor.DecryptIt(row.oPwd), 
     } 

podemos utilizar un bucle foreach también para actualizar una sola propiedad. no es necesario seleccionar todas las propiedades en la próxima consulta.