2011-07-08 11 views
6

Utilizo EntityFramework 4, LINQ y C#.LINQ - utilizando una expresión de consulta para calcular la diferencia de tiempo de datos

Necesito datos de visualización en un GridView a partir de una expresión de consulta utilizando Linq; Necesito proyecto como anonymous type un valor calcular en volar DateTime.UtcNow - cl.DateLocked Nota: cl.DateLocked es del tipo DateTime y necesito saber cuántos días de diferencia hay entre estas dos fechas.

Con esta consulta recibo un error:

DbArithmeticExpression arguments must have a numeric common type. 

alguna idea de cómo hacerlo en LINQ? Si Linq no permite cómo hacerlo de una manera diferente?

Gracias por su tiempo

var queryContentsLocked = from cl in context.CmsContentsLockedBies 
          join cnt in context.CmsContents 
          on cl.ContentId equals cnt.ContentId 
          join u in context.aspnet_Users 
          on cl.UserId equals u.UserId 
          select new 
          { 
          cl.DateLocked, 
          cnt.ContentId, 
          cnt.Title, 
          u.UserName, 
          u.UserId, 
          TimePan = DateTime.UtcNow - cl.DateLocked // Problem here!!! 
          }; 

Respuesta

7
var queryContentsLocked = from cl in context.CmsContentsLockedBies 
          join cnt in context.CmsContents 
          on cl.ContentId equals cnt.ContentId 
          join u in context.aspnet_Users 
          on cl.UserId equals u.UserId 
          select new 
          { 
          cl.DateLocked, 
          cnt.ContentId, 
          cnt.Title, 
          u.UserName, 
          u.UserId, 
          Days = SqlFunctions.DateDiff("day", cl.DateLocked, DateTime.UtcNow) 
          }; 
+0

Gracias @Magnus está funcionando genial. El método DateDiff está en el espacio de nombres: using System.Data.Objects.SqlClient; – GibboK

-2

Prueba esto:

DateTime.UtcNow.Subtract(cl.DateLocked).TotalDays 
+0

Error: \t Declarador de miembro de tipo anónimo no válido. Debe hacerse dentro de la expresión de consulta Linq. – GibboK

2

Sin utilizar cualquier SqlFunction

var grandTotalWork = (from t in db.AssignmentHandymandetails 
          join ad in db.AssignmentDetails on t.assignment_detail_id equals ad.assignment_detail_id 
          where ad.assignment_id == Convert.ToInt32(Label_assignmentId.Text) 
          select new { startTime = t.started_time.Value.TimeOfDay, endTime = t.end_time.Value.TimeOfDay, TotalWorkTime = (t.started_time.Value.TimeOfDay.Duration() - t.end_time.Value.TimeOfDay.Duration()).Duration()}); 

entonces se puede unir el resultado en GridView desea

+1

gracias por la sugerencia, realmente lo aprecio ahora el código es legible – Dipen

+0

genial, gracias :-) – kleopatra

Cuestiones relacionadas