Comment retourner le type anonyme de la méthode c# qui utilise LINQ à SQL [dupliquer]

possibilité de dupliquer:

LINQ to SQL: Return anonymous type?

j'ai un LINQ standard à la requête SQL, qui renvoie les données comme un type anonyme (contenant environ 6 colonnes de données de différents types de données).

je voudrais rendre cet objet retourné Disponible à d'autres parties du programme, soit en le retournant à la la méthode de l'appelant, ou en l'affectant à une propriété de l'objet contenant la méthode.

Comment puis-je faire cela étant donné qu'il s'agit d'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 };
    }
44
demandé sur Community 2009-07-01 22:03:52

6 réponses

faire le type anonyme dans une classe...

public class Person
{
    public Person() {
    }

    public String Name { get; set; }
    public DateTime DOB { get; set; }
}


Person p = 
    from person in db.People 
    where person.Id = 1 
    select new Person { 
        Name = person.Name,
        DOB = person.DateOfBirth
    }
65
répondu 2009-07-01 18:07:42

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

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 être Système.Objet. Vous pouvez alors faire des piratages maléfiques de casting pour obtenir une valeur dactylographiée dans une autre méthode. C'est très fragile et je ne le recommande pas.
  2. utilisez une méthode générique et un truc d'inférence de type pour obtenir le type de retour correct. Cela nécessiterait une définition de signature très intéressante pour votre approche.

les types anonymes n'étaient pas vraiment destinés à être transmis de cette façon. Au point où vous avez besoin de les passer entre vos fonctions de cette manière, vous feriez mieux de définir explicitement un type.

19
répondu JaredPar 2009-07-01 18:10:09

utiliser var n'en fait pas un type anonyme. Utiliser var signifie simplement laisser cette variable être du type disponible sur le côté droit de la tâche. 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 variable "personne" est de type "personne", bien qu'elle utilise le mot-clé var.

Les types

anonymes sont créés en utilisant nouveau { Nom = ... }. Dans ce cas, c'est un nouveau cours anonyme. La seule chose à laquelle vous pouvez l'assigner est une variable définie en utilisant var (ou objet) puisqu'il n'y a pas de nom existant à utiliser.

par exemple:

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

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

généralement, comme @Chalkey le dit, si vous voulez transmettre le résultat à une autre méthode, utilisez 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.

6
répondu tvanfosson 2009-07-01 18:19:29

Jon Skeet a écrit un blog sur la façon de faire cela, qui est tout à fait à juste titre intitulé horriblement Grotty Hack . Tout comme le titre le suggère, vous ne devriez vraiment pas être à la recherche de moyens pour retourner un type anonyme. Au lieu de cela, vous devriez créer un type qui peut être retourné car c'est la bonne façon d'implémenter cette fonctionnalité.

par conséquent, je vous recommande de créer une définition concrète du type à retourner et puis peupler cela dans votre requête pour il doit être retourné.

5
répondu Jeff Yates 2009-07-01 18:10:21

Ça dépend de la façon dont le code d'appel va utiliser les données.

Si vous faites de la simple liaison de données, sont vraiment ne se soucient pas le type (c'est à dire que vous n'avez pas explicitement l'accès à des propriétés dans votre code C#), vous pouvez transmettre les résultats à l'arrière comme un IEnumberable.

dans la plupart des cas, vous appelez les propriétés par leur nom, via des chaînes magiques, donc le type exact n'a pas d'importance de toute façon.

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

2
répondu Chris Brandsma 2009-07-01 19:20:33

si vous devez passer autour des résultats dans une grande application, vous pouvez utiliser le dictionnaire. Oui, vous avez certains au-dessus lors du moulage, mais au moins vous réduisez vous jeter des objets.

0
répondu David Robbins 2009-07-01 18:35:23