2009-06-04 6 views
5

Je travaille sur une application ASP.NET utilisant LinqToSQL. Lorsque la page se charge, je lance une requête et enregistre les résultats dans une variable ... var tasks = query expression. Je puis enregistrez ceci dans une variable de session Session["Tasks"] = tasks ...C# retour au type var?

Est-il possible de jeter cet objet de la session à son état d'origine var, donc je peux exécuter des méthodes telles que Count(), Reverse() et ainsi de suite?

Merci

Répondre

15

var est juste court-main pour l'inférence de type ... la vraie question ici est: quel est le type sous-jacent?

Si elle implique un type anonyme (à savoir nouveau {...}, ou List<> y-de), alors il n'y a pas manière élégante (bien qu'il puisse se faire de manière hacky). En bref; ne pas utiliser des types anonymes dans ce scénario ...

Notez qu'une expression de requête tels que IQueryable<T> ne données - est une requête - pour stocker les données (pour un cache) que vous auriez besoin à utiliser .ToList()/.ToArray() etc.

Important: vous ne devriez pas stocker une expression de requête en session; au mieux (fournisseur de session en mémoire) qui maintiendra le contexte de données en vie; au pire (fournisseur de session de base de données etc) cela ne fonctionnera pas, car un contexte de données n'est pas sérialisable. Stockage résultats à partir d'une requête est très bien; mais sinon, reconstruisez l'expression de requête par requête.

Dans ce cas, vous pourriez être en mesure d'utiliser (par exemple):

var tasksQuery = from task in ctx.Tasks 
      where task.IsActive 
      orderby task.Created 
      select task; // this is IQueryable<Task> 

Session["Tasts"] = tasksQuery.ToArray(); // this is Task[] 
... 
var tasks = (Task[]) Session["Tasts"]; // this is Task[] 
+0

Je pensais que cela pourrait être quelque chose dans le style de .ToList() puis de mettre cela dans la session. La note sur la conservation du contexte de données était intéressante. Merci pour ça :) –

4

var est pas un type, il dit juste C# vous déterminer le type.

string s = "Hello world!"; 

et

var s = "Hello world!"; 

sont équivalentes et redonnent le même s. Il vous manque probablement

using System.Linq 

ou un autre qui ajoute les méthodes d'extension que vous recherchez.

+0

Les méthodes que je cherche sont là, le problème est de retourner à la var d'origine lors d'un rappel. Vous pouvez faire (String) Session ["task"] ... mais pour autant que je sache, vous ne pouvez pas faire (var) Session ["task"]. –

0

var n'est pas une sorte de type « dynamique », cela signifie simplement que le compilateur infère le type réel selon la type de la valeur d'initialisation. Le type est déterminé statiquement, il n'est pas possible de "cast to var"

Questions connexes