2017-10-17 10 views
-1

J'ai modèle avec 2 DateTime propriétésDifférence entre deux propriétés datetime dans le modèle (C#)

Voici le code

sing System.ComponentModel.DataAnnotations.Schema; 

namespace GoogleMapsAsp_Net.Models 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Park 
    { 
     public int parkId { get; set; } 
     public decimal Longitude { get; set; } 
     public decimal Latitude { get; set; } 
     public Nullable<System.DateTime> TimeStart { get; set; } 
     public Nullable<System.DateTime> TimeEnd { get; set; } 
     [NotMapped] 
     public TimeSpan? Difference { get { return TimeStart - TimeEnd; } } 
    } 
} 

Je veux calculer la différence entre les deux en quelques minutes et écrire la différence dans la nouvelle propriété. J'ai donc écrit cette propriété

public TimeSpan? Difference { get { return TimeStart - TimeEnd; } } 

Mais quand je lance projet, je cette erreur

« Le membre type spécifié « différence » ne sont pas pris en charge dans LINQ to Entities. Seuls les initialiseurs, les membres d'entité et les propriétés de navigation d'entité sont pris en charge. '

Voici ma méthode sur arrière où je tente de prendre la différence de propriétés du modèle

public JsonResult GetPlaces() 
    { 
     using (var ctx = new GoogleMapsAsp_NetContext()) 
     { 
      const int coeff = 2; 
      var items = ctx.Parks.Select(
       x => new 
       { 
        lng = x.Longitude, 
        lat = x.Latitude, 
        difference = x.Difference 
       } 
      ).ToList(); 
      return Json(items.ToArray(), JsonRequestBehavior.AllowGet); 
     } 
    } 

Comment puis-je calculer correctement

+2

Utilisez un modèle de vue - cette propriété ne doit pas faire partie de votre modèle de données –

+1

utilisez-vous la propriété 'Difference' dans une clause' Where'? Si oui, vous pouvez compter sur l'une des fonctions System.Data.Entity.DbFunctions.Diff * au lieu de 'Difference' – jbl

+0

Il n'est pas clair pourquoi vous voudriez calculer la différence au niveau de la base de données. Est-il impliqué dans un 'OrderBy', avec un' Take? impliquant coeff? – jbl

Répondre

4

Le problème est que vous utilisez la propriété Distance dans la requête qui est exécutée dans la base de données, ce qui n'est pas possible. Ajouter AsEnumerable pour amener les données avant d'utiliser la propriété:

var items = ctx.Parks.AsEnumerable().Select(
      x => new { 
       lng = x.Longitude, 
       lat = x.Latitude, 
       difference = x.Difference 
      }).ToArray(); 

Pas besoin de créer d'abord comme un List puis appelez ToArray. Il suffit d'utiliser ToArray une fois


précédemment non pertinent répondu: Utilisez l'attribut [NotMapped] si EF ignore la propriété:

[NotMapped] 
public TimeSpan? Difference { get { return TimeStart - TimeEnd; } } 

Ou mieux encore que @Stephen a commenté: Utiliser un modèle de vue - que la propriété ne doit pas faire partie de votre modèle de données

+1

Et dans le cas où ce n'est pas ajouté, 'using System.ComponentModel.DataAnnotations.Schema;'. –

+0

Pour ajouter à cette réponse merveilleuse, la deuxième ligne est redondante; 'DateTime? - DateTime? 'Renvoie déjà' TimeSpan? 'Et fonctionne correctement sur les valeurs' null' (c'est-à-dire retourne 'null'). – decPL

+0

@decPL - ops vrai! Merci. Vérifié et vous avez raison. Réponse mise à jour –