44 votes

Comment retourner un type anonyme à partir de la méthode c # qui utilise LINQ to SQL

Double Possible:
LINQ to SQL: de Retour de type anonyme?

J'ai une LINQ to SQL de la requête, qui retourne les données sous forme d'un type anonyme (contenant environ 6 colonnes de données de divers types de données).

Je voudrais faire de cet objet renvoyé à la disposition des autres parties du programme, soit par un retour à la méthode de l'appelant, ou en l'affectant à une propriété de l'objet contenant la méthode.

Comment puis-je faire étant donné que c'est un type anonyme ("var")?

EDIT Voici le code:

    using (ormDataContext context = new ormDataContext(connStr))
    {
        var electionInfo = from t1 in context.elections
                   join t2 in context.election_status
                   on t1.statusID equals t2.statusID
                   select new { t1, t2 };
    }

19voto

JaredPar Points 333733

Vous ne pouvez pas taper n'importe quelle méthode en C# pour être le type explicite d'un type anonyme. Ils ne peuvent pas être "nommés", pour ainsi dire, et ne peuvent donc pas apparaître dans les métadonnées de signatures.

Si vous voulez vraiment retourner une valeur qui est un type anonyme il y a 2 options

  1. Ont le type de retour de la méthode du Système.Objet. Vous pouvez ensuite faire le mal casting hacks pour obtenir une valeur typée dans une autre méthode. C'est très fragile et je ne le recommande pas.
  2. L'utilisation d'une méthode générique et une inférence de type astuce pour obtenir le type de retour correcte. Cela exigerait une signature intéressante définition de votre approche.

Les types anonymes n'étaient pas vraiment censés être passés dans ce mode. Au point que vous avez besoin pour circuler entre vos fonctions de cette façon, vous êtes mieux de définir explicitement un type.

6voto

tvanfosson Points 268301

À l'aide de la var n'est pas un type anonyme. L'utilisation de var signifie simplement laisser cette variable de type disponibles sur le côté droit de la cession. C'est juste à court de main. Si la chose sur le côté droit est une vraie classe, la variable sera de ce type.

Par exemple:

var person = new Person { Name = "bob" };

La personne est une variable de type Personne, même si elle a utilisé le mot-clé var.

Les types anonymes sont créés à l'aide de nouveaux { Nom = ... }. Dans ce cas, c'est une nouvelle classe anonyme. La seule chose que vous pouvez l'affecter à une variable définie à l'aide du var (ou l'objet) puisqu'il n'existe pas de nom à utiliser.

Par exemple:

var person = new { Name = "bob" };

Dans ce cas, la personne est un type anonyme définie au moment de l'exécution.

En général, comme @Chalkey dit, si vous voulez passer le résultat à une autre méthode, l'utilisation d'un type nommé, pas un anonyme.

Si vous êtes obligé d'utiliser un type anonyme, vous aurez à passer un objet de type Object, puis utiliser la réflexion pour parvenir à ses propriétés.

5voto

Jeff Yates Points 36725

Jon Skeet a écrit un blog sur la façon de faire, ce qui est tout à fait à juste titre intitulé Horriblement Grotty Hack. Tout comme le titre l'indique, vous ne devriez vraiment pas être à la recherche de moyens pour retourner un type anonyme. Au lieu de cela, vous devriez être la création d'un type qui peut être retourné comme ce est la bonne façon de mettre en œuvre cette fonctionnalité.

Par conséquent, je vous recommande de créer une définition concrète du type à être retourné, puis de renseigner dans votre requête pour qu'il soit renvoyé.

2voto

Chris Brandsma Points 7225

Cela dépend en quelque sorte de la manière dont le code appelant va utiliser les données.

Si vous faites une simple liaison de données sans vous soucier du type (c.-à-d. Que vous n'avez pas à accéder explicitement aux propriétés dans votre code C #), vous pouvez renvoyer les résultats en tant que IEnumberable.

Dans la plupart des cas, vous appelez les propriétés par leur nom, via des chaînes magiques, de toute façon, donc le type exact importe peu.

Sinon, vous devez convertir le type anonyme en un type nommé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X