Convertir type anonyme à nouveau C# 7 tuple de type

La nouvelle version de C# est là, avec la nouvelle fonctionnalité très utile Tuple Types:

public IQueryable<T> Query<T>();

public (int id, string name) GetSomeInfo() {
    var obj = Query<SomeType>()
        .Select(o => new {
            id = o.Id,
            name = o.Name,
        })
        .First();

    return (id: obj.id, name: obj.name);
}

Est-il un moyen de convertir mon anonyme de type object obj pour le tuple que je veux revenir sans cartographie de la propriété par propriété (en supposant que les noms des propriétés de match)?

Le contexte est dans un ORM, mon SomeType objet a beaucoup d'autres propriétés, et il est mappé à une table avec beaucoup de colonnes. Je veux faire une requête qui apporte juste l'ID et le NOM, j'ai donc besoin de convertir le type anonyme dans un tuple, ou j'ai besoin d'un ORM Linq Fournisseur de savoir comment comprendre un n-uplet et mettre les propriétés liées colonnes dans l'instruction SQL select.

  • pourquoi ne pas changer votre Select() pour créer un tuple instances plutôt que des instances d'un type anonyme?
  • êtes-vous certain que la volonté de traduire dans linq to entities? Il n'est pas explicitement un objectif EF cas ici, mais il serait bon de le préciser.
  • Je pense que vous pouvez juste faire return (obj.id, obj.name); puisque vous avez les noms dans la signature de la fonction, mais je n'ai pas le C# 7 droit maintenant à le tester.
  • EF est discutable, les OP du code est de retour (int id, string name).
  • Attendez, vous êtes sûr de votre classe anonyme est new { id => o.Id, name => o.Name } et pas new { id = o.Id, name = o.Name }
  • comment est-EF discutable? L'OP du code pourrait certainement revenir un n-uplet d'après la cartographie des résultats d'une requête.
  • EF n'est jamais discutable lorsque l'on parle de requêtes Linq comme il se comporte tout à fait différemment de Linq to Objects.
  • obj contient une instance d'un type anonyme; l'OP veut convertir dans un tuple.
  • et il y a une grande différence entre la cartographie d'un tuple DANS la sélection de l'expression et de la cartographie après que la requête a été résolu avec .First(). Si c'est une Linq to Sql expression, il va probablement échouer.
  • à l'exception de l'OP, la question n'est pas à propos d'une requête LINQ, c'est à propos de anonyme de type -> n-uplet. LINQ est hors de l'image.
  • Vous avez dit de le faire dans le Select, la dernière fois que j'ai vérifié, c'est la partie de Linq.
  • peut-être l'OP devrait modifier la question de supprimer la spéculation? Mon commentaire (essentiellement) demande d'éclaircissements pour laquelle les OP pourraient modifier à-dire "non, je suis en utilisant EF."
  • Que je peux accepter.
  • Je veux savoir comment le faire dans ORM Linq mappé requêtes, je vais mettre à jour la question. Merci à tous.

InformationsquelleAutor lmcarreiro | 2017-04-13