web-dev-qa-db-fra.com

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

Duplicata possible:
LINQ to SQL: renvoyer un type anonyme?

J'ai une requête LINQ to SQL standard, qui renvoie les données sous forme anonyme (contenant environ 6 colonnes de données de différents types de données).

Je voudrais mettre cet objet retourné à la disposition d'autres parties du programme, soit en le renvoyant à l'appelant de méthode, soit en l'assignant à une propriété de l'objet contenant la méthode.

Comment est-ce que je peux faire ceci é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 };
    }
44
alchemical

Transformez le type anonyme en 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
user110714

Vous ne pouvez pas saisir de 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 signatures de métadonnées.

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

  1. Faites en sorte que le type de retour de la méthode soit System.Object. Vous pouvez ensuite faire des piratages malveillants pour obtenir une valeur tapé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 une astuce 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 moment où vous devez les faire circuler entre vos fonctions de cette manière, il vaut mieux définir explicitement un type.

19
JaredPar

L'utilisation de var n'en fait pas un type anonyme. L'utilisation de var signifie simplement que cette variable doit être du type disponible sur le côté droit de l'affectation. C'est juste une main courte. Si la chose du côté droit est une vraie classe, la variable sera de ce type.

Par exemple:

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

La variable person est de type Person, même si elle utilise le mot-clé var.

Les types anonymes sont créés en utilisant new {Name = ...}. Dans ce cas, il s'agit d'une nouvelle classe anonyme. La seule chose à laquelle vous pouvez l'affecter est une variable définie à l'aide de var (ou objet) car il n'y a aucun nom existant à utiliser.

Par exemple:

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

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

En règle générale, comme le dit @Chalkey, si vous souhaitez transmettre le résultat à une autre méthode, utilisez un type nommé, pas anonyme.

Si vous êtes obligé d'utiliser un type anonyme, vous devrez le renvoyer en tant qu'objet de type Object, puis utiliser la réflexion pour accéder à ses propriétés.

6
tvanfosson

Jon Skeet a écrit un blog sur la façon de le faire, qui est à juste titre intitulé Horribly Grotty Hack . Tout comme le titre le suggère, vous ne devriez vraiment pas chercher de moyens de renvoyer un type anonyme. Au lieu de cela, vous devez créer un type qui peut être renvoyé 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 à renvoyer, puis de le remplir dans votre requête pour qu'il soit renvoyé.

5
Jeff Yates

Cela dépend de la façon dont le code appelant va utiliser les données.

Si vous effectuez une liaison de données simple, que vous ne vous souciez vraiment pas du type (c'est-à-dire que vous n'avez pas à accéder explicitement aux propriétés de votre code C #), vous pouvez renvoyer les résultats en tant qu'IEnumberable.

Dans la plupart des cas de liaison de données, vous appelez des propriétés par nom, via des chaînes magiques, de toute façon, 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
Chris Brandsma

Si vous devez faire circuler les résultats dans une grande application, vous pouvez utiliser Dictionnaire. Oui, vous avez des frais généraux lors du lancer, mais au moins vous réduisez, vous jetez des objets.

0
David Robbins