La réponse courte est non, dans la forme actuelle de C#7 il n'est pas dans le cadre de manière à atteindre vos objectifs mot à mot, puisque vous voulez accomplir:
- Linq-to-entités
- La cartographie à un sous-ensemble de colonnes
- En évitant de propriété par propriété de la cartographie d'une coutume, d'anonymes ou de type C#7 tuple par la cartographie directement à a C#7 n-uplet.
Parce qu' Query<SomeType>
expose une IQueryable
, toute sorte de projection doit être effectuée à une arborescence d'expression .Select(x => new {})
.
Il est ouvert roslyn problème pour l'ajout de ce soutien, mais il n'existe pas encore.
En conséquence, jusqu'à ce que ce soutien est ajouté, vous pouvez le connecter manuellement à partir d'un type anonyme à un n-uplet, ou le retour de la totalité de l'enregistrement et de la carte le résultat d'un tuple directement pour éviter les deux démarches, mais c'est évidemment inefficace.
Bien que cette restriction est actuellement cuit dans Linq-to-Entités en raison d'un manque de soutien et de l'incapacité à utiliser paramétrable constructeurs en .Select()
de la projection, les deux Linq-to-NHibernate et Linq-to-Sql permettre un hack dans le formulaire de création d'un nouveau System.Tuple
dans la .Select()
de projection, puis retour à un ValueTuple avec la .ToValueTuple() la méthode d'extension:
public IQueryable<T> Query<T>();
public (int id, string name) GetSomeInfo() {
var obj = Query<SomeType>()
.Select(o => new System.Tuple<int, string>(o.Id, o.Name))
.First();
return obj.ToValueTuple();
}
Depuis Que Le Système.N-uplet peut être mappé à une expression, vous pouvez retourner un sous-ensemble de données à partir de votre table et le cadre pour gérer la cartographie de votre C#7 n-uplet. Vous pouvez ensuite déconstruire les arguments avec toute convention de nommage à vous de choisir:
(int id, string customName) info = GetSomeInfo();
Console.Write(info.customName);