LINQ requête select avec Anonyme de type et de type Défini par l'utilisateur
Classe anonyme a des propriétés en lecture seulement en c#. Qui est souvent utilisé pour déclarer des linq requête select pour obtenir des valeurs particulières de la base de données.
Dans mon code j'ai la requête suivante.La chose qui me confond sélection de nouveaux objets de la classe anonyme à l'aide de la nouvelle déclaration. J'ai eu une classe de modèle de StudentClerkshipsLogModel
. Lorsque j'utilise le nom du modèle, le résultat de la requête, autoriser la modification.
var query = (from entity in _tblStudentClerkshipsLog.GetQueryable()
where entity.StudentID == intStudentID
select new StudentClerkshipsLogModel
{
StudentClerkshipID = entity.StudentClerkshipID,
StudentID = entity.StudentID,
ClerkshipID = entity.ClerkshipID,
}).ToList();
Quand je ne faisait pas mention de type après new
dans select
déclaration, je suis incapable de le quitter. le compilateur génère une erreur . enonymous objet est en lecture seule.
var query = (from entity in _tblStudentClerkshipsLog.GetQueryable()
where entity.StudentID == intStudentID
select new
{
StudentClerkshipID = entity.StudentClerkshipID,
StudentID = entity.StudentID,
ClerkshipID = entity.ClerkshipID,
}).ToList()
ma question est comment linq lier le sujet de deux de requête différemment . Les deux requêtes ont de liaison dynamique ou première est statique.
Grâce
je veux modifier le code plus tard .mais j'ai besoin de connaître la différence entre les requêtes select, donc je peut choisir la meilleure .
il ressemble à une faute de frappe. "Je suis incapable de modifier".
Ils sont juste différents. L'un des projets d'un type anonyme, les autres projets à un type nommé. Si vous avez besoin de modifier les objets tard le, vous avez certainement ne pouvez pas utiliser un type anonyme, sous la forme de propriétés sur les types anonymes sont en lecture seule. Qui n'a rien à voir avec LINQ directement...
définir un critère de "mieux".
OriginalL'auteur Muhammad Nasir | 2015-09-08
Vous devez vous connecter pour publier un commentaire.
Si je vous comprends bien, vous vous demandez, comment LINQ fournisseur peut définir les propriétés de l'objet anonyme, car ils sont de "vrais" propriétés en lecture seulement (il n'y a aucune
private set
, maisget
seulement)?Lorsque vous appelez
Select
méthode d'extension pourIQueryable<T>
, il accepte un expression de typeExpression<Func<T, TResult>
. Si vous allez écrire certains de stub pourSelect
vous pouvez regarder dans le générés expression, à l'aide du débogueur:La différence est dans la façon dont le compilateur génère des lambda expressions de types nommés et les types anonymes. Lorsque vous appelez
Select
pour type nommé, expression ressemblera à ceci:Qui est, tout d'abord de nouvelles
Person
objet sera construit, et ensuite, les membres seront initialisés (MemberInit
expression).Mais lorsque vous appelez
Select
de type anonyme, l'expression sera construit comme un appel de constructeur (New
expression):LINQ fournisseur compile ces lambdas dans délégués, lors de la matérialisation des résultats de la requête, et, finalement, se contente d'appeler le constructeur pour le type anonyme.
OriginalL'auteur Dennis
L'erreur que vous obtenez vraiment ne rien avoir à faire avec LINQ. Vous pouvez voir la même chose sans l'aide de LINQ:
Donc, si vous voulez modifier les objets récupérés par votre requête LINQ, vous ne devriez pas utiliser les types anonymes. Mais les deux requêtes LINQ sont statiquement lié - les types anonymes sont encore entièrement connues à la compilation, le compilateur s'applique normal type de restrictions. Par exemple:
OriginalL'auteur Jon Skeet
J'ai Trouvé de suite la différence avec un type anonyme résultat d'une LINQ résultat.
Résultat n'est pas en mesure de modifier par exemple, si nous attribuer de la valeur à un gridview il
sera en lecture seule.
Problème avec la portée d'un objet anonyme.nous ne pouvons pas passer le type de
à une autre méthode. définir un paramètre de type var; var doit toujours
être suivie par une expression d'initialisation.
Si vous avez besoin de résultat que dans le contexte actuel de lire seul but d'utiliser requête anonyme . Si vous avez besoin d'autres fonction, vous devez définir le type de l'objet. le type d'objet après
new
sera créé avec les propriétés que vous souhaitez obtenir de résultat de définir ensuite dans des accolades{}
.Il n'est pas nécessaire d'initialiser toutes les valeur de la classe du modèle.
OriginalL'auteur Muhammad Nasir