2010-07-19 5 views
1

Je suis aux prises avec un problème (généralement simple à traiter).Impossible de convertir le type de retour anonyme d'une requête en un type d'entité

J'ai une base de données contenant une table "mesures". Chaque mesure a un horodatage (datetime), une valeur (décimale), un type de mesure (clé étrangère à une table de correspondance) et appartient à un «élément de capacité» (une table principale). J'ai importé la base de données SQL dans Entity Framework et créé un modèle à partir de celle-ci. Maintenant, je veux demander pour la ligne de base. Une ligne de base est l'état actuel de l'élément de capacité et est représentée par les dernières mesures pour chaque type de cet élément de capacité particulier.

Donc ce que la requête doit retourner est: pour un certain CapacityItem, donnez-moi la dernière mesure de chaque type de mesure. Dans une requête SQL, je ferais un "group by" sur le type de mesure et ferais un MAX() sur l'horodatage. Mais dans Linq-2-Entities, j'ai l'impression d'être dans la boue. J'ai besoin d'une fonction qui retourne IQueryable<Measurement>, contenant toutes les mesures de base, mais mes requêtes renvoient toutes une sorte de type anonyme qui est impossible à cataloguer.

J'espère que je me suis fait clair. Quand je relis ça, je peux l'imager, ça n'a pas beaucoup de sens. Mais j'ai regardé ceci trop longtemps, et mon esprit commence à faire des choses drôles :-)

Quelqu'un ici peut me mettre dans la bonne direction? S'il vous plaît demander des éclaircissements si nécessaire.

Merci mille fois d'avance.

~ Rob

+0

Il pourrait être plus facile si vous nous montrez un peu de votre code que vous avez déjà. Il semble également que vous ayez besoin de lire un peu sur LINQ et Entity Framework. Le lien suivant m'a été d'une valeur inestimable et est rempli d'exemples de la façon d'accomplir certaines choses dans vos requêtes LINQ. http://msdn.microsoft.com/en-us/library/bb394939.aspx – Jagd

+0

@jagd, vous avez raison, je suis un débutant LINQ et EF et j'ai sous-estimé la courbe d'apprentissage. Merci pour le lien. C'était déjà dans mes marque-pages, cependant ;-) –

Répondre

2

Quelque chose comme:

var q = from m in Context.Measurements 
     group m by m.MeasurementType.Id into group 
     from bl in group 
     where bl.TimeStamp == group.Max(g => g.TimeStamp) 
     select bl; 

Ceci est du haut de ma tête et devinettes au sujet de votre DB. Vous devrez peut-être le modifier.

+0

Vous étiez presque sur place! Il y a un bug dans le groupement (vous ne pouvez pas nommer un groupe 'group') et j'ai dû ajouter une clause Where pour filtrer l'élément de capacité désiré, mais l'idée générale est exactement ce dont j'avais besoin. Cela vous a pris 5 minutes? Je voudrais vous avoir demandé il y a 24 heures :-) –

Questions connexes