Linq SÉLECTIONNEZ avec ExecuteQuery
J'obtiens l'erreur:
Le type de Système.Int32[]' doit déclarer une valeur par défaut (sans paramètre) constructeur afin de être construits au cours de la cartographie.
Avec le code:
var gamePlayRecord = db.ExecuteQuery<int[]>("SELECT UserID, IPID, GameID FROM ArcadeGames WHERE ID = " + gamePlayRecordID).Single();
var userID = gamePlayRecord[0];
var ipID = gamePlayRecord[1];
var gameID = gamePlayRecord[2];
Je sais que c'est mal, mais quelqu'un peut-il me montrer comment le faire correctement sans avoir besoin de créer un nouvel objet de préférence?
Juste un sauvage guess - avez-vous essayé
Je dois vous demander, ce est la raison impérieuse vous ne voulez pas avoir l'
reportez-vous à msdn.microsoft.com/en-us/library/vstudio/...
et
List<int>
?Je dois vous demander, ce est la raison impérieuse vous ne voulez pas avoir l'
class
?reportez-vous à msdn.microsoft.com/en-us/library/vstudio/...
et
DbDataRecord
est aussi un object
. Il a un indexeur, mais ce n'est pas un tableau.OriginalL'auteur Tom Gullen | 2013-07-12
Vous devez vous connecter pour publier un commentaire.
Résultat de cette requête n'est pas
int[]
mais une ligne avec des numéros.pas la bonne solution: utiliser pour chaque nombre:
ou de Créer des requêtes sql
ou Créer une classe ...
OriginalL'auteur slavoo
Je pense que j'ai mal compris la question un petit peu. Mais comme @goric expliqué: Un ORM mappeur veut cartographier les résultats à un objet. Si vous ne voulez pas un objet de classe ou de ne pas utiliser un ORM mappeur, mais l'utilisation de la base de SqlDataReader.
Query
méthode, il possède une mémoire efficace de tableau d'objet pour les résultats.OriginalL'auteur Andre van Heerwaarde
L'ORM, après avoir récupéré les résultats SQL, tente de créer une nouvelle instance du type que vous avez spécifié, et puis de trouver les propriétés de ce type avec le même nom que les colonnes sélectionnées dans la requête. Donc dans votre cas, c'est d'essayer de créer un nouveau
int[]
et puis définissez les propriétés appeléUserId
,IPId
, etGameId
.Il existe quelques problèmes ici. Tout d'abord, lors de la création de l'instance, par défaut, un constructeur sans paramètre est utilisé.
int[]
ne pas en avoir un qui peut être appelé, et c'est l'erreur que vous voyez. En supposant qu'il y en avait une, je m'attends à ce code échoue après l'instanciation lorsque vous tentez de définir une propriété appeléeUserId
.Un moyen facile de contourner cela est de créer votre propre classe, comme d'autres ont répondu. Si vous voulez une façon qui n'a pas besoin d'un nouveau type, vous pouvez utiliser quelque chose comme la non-générique
Query
classe à partir de la dapper de la bibliothèque (voir Marc Gravel réponse dans cette post). Entity Framework semble également fournir certaines des fonctionnalités similaires à l'aide de laObjectQuery
etDbDataRecord
classes, comme le montre ici.class
, et il sait qu'il avait besoin de la propriété des noms de match, il essaie juste de trouver un moyen de contourner la création de l'objet.J'essaie de ne pas faire des hypothèses sur ce qui est/n'est pas compris par les OP, et il n'est pas évident à partir de la question de ce que son niveau de familarity est avec le sujet. Je ne vois pas l'utilisation d'un tableau est une exigence pour la réponse, mon interprétation est qu'il ne voulait pas explicitement d'avoir à créer un nouveau type. Je ne pense pas que quoi que ce soit dans la réponse est trop longue haleine ou hors de propos.
Lorsque l'OP dit sans avoir besoin de créer un nouvel objet, de préférence clairement l'OP sait comment le faire création d'un nouvel objet. Sa compréhension va loin. Ce qu'il ne sait pas est comment le faire avec quelque chose comme un tableau où une nouvelle instance d'un objet ne doit pas être créé.
OriginalL'auteur goric
Ici est et laid hack pour ce faire:
Fonctionne sur ma machine...
OriginalL'auteur user1429080
Ne pas répondre directement à votre question, mais prendre soin de la sécurité...
Votre code est probablement vulnérables aux attaques par injection SQL, selon l'endroit où vient la valeur de gamePlayRecordID.
À corriger, faire la requête SQL paramétrée (ou valider l'entrée, si vient de "non fiables" sources):
que la première solution a... de Nombreuses solutions proposées pourraient avoir le même problème de sécurité.
OriginalL'auteur lrodriguez
Il devrait être quelque chose comme ceci
Code de référence de la prise de http://msdn.microsoft.com/en-us/library/bb361109.aspx
L'OP ne veut pas créer la nouvelle classe. mais il peut utiliser la classe existante qui est déjà une table.
Non, ce n'est pas différent. Il ne veut pas créer un nouvel objet.
Perrenoud êtes-vous le responsable du projet de Tom Gullen ?
Non, bien sûr que non, mais vous pouvez très facilement en déduire sa compréhension actuelle de l'objet basé sur la façon dont la question a été posée. Allez, maintenant.
OriginalL'auteur Bhaarat
Je ne pense pas qu'il y est une bonne façon de le faire, parce qu'il veut l'associer à un objet avec des propriétés nommées. Même si vous êtes en mesure d'instancier le tableau, il ne sera pas essayer de la carte pour le nom des champs.
Si vous ne voulez pas créer une classe pour elle, mais sont plus intéressés à créer un objet dynamique, vous pouvez prendre un coup d'oeil à dapper orm. L'installer via nuget.
vous pouvez faire quelque chose comme ceci:
OriginalL'auteur Andre van Heerwaarde