Comment ajouter un nouvel enregistrement à une variable IQueryable?

les résultats IQueryable sont questionnés à partir de ma db en utilisant LINQ, Comment puis-je ajouter un nouvel enregistrement au résultat IQueryable.

22
demandé sur Dan Beaulieu 2009-01-12 10:50:19

7 réponses

voulez-vous l'ajouter à la base de données, ou juste à la liste des résultats que d'autres choses comme la reliure de données utiliseront?

si c'est le PREMIER, vous aurez besoin d'utiliser l'opération add normale pour N'importe quel type de LINQ que vous utilisez, mais à la représentation de la table plutôt que L'IQueryable. Les requêtes ne lisent que les données.

si c'est ce dernier, utilisez énumérable.Concat pour concaténer votre séquence existante (L'IQueryable) avec un nouveau contenant vos entrées supplémentaires (un tableau, ferait l'affaire ici, ou une liste), et utiliser le résultat pour la liaison etc. Il est probablement intéressant d'utiliser AsEnumerable () d'abord pour s'assurer que Enumerable est utilisé au lieu de Queryable. Par exemple:

IQueryable<string> names = [...];
names = names.AsEnumerable().Concat(new[] { "(None)", "(Add new)" });
36
répondu Jon Skeet 2009-01-12 07:58:04

vous devez d'abord le convertir en liste;

IQueryable<int> foo = new SomeQueryable<int<();
List<int> list = foo.ToList();
list.Add(5);

ou en utilisant Concat

IQueryable<int> foo = new SomeQueryable<int<();
foo = foo.Concat(new int[]{5});

EDIT: assurez-vous d'avoir à réaffecter foo.

11
répondu Ali Ersöz 2012-05-02 17:49:38

la réponse simple est qu'à moins que vous n'ajoutiez l'enregistrement au datastore sous-jacent que l'Iqueryable interroge, vous ne pouvez pas ajouter un nouvel enregistrement dans un IQueryable. Donc, si vous utilisez LinqToSql ensuite, vous devez ajouter une ligne dans la table que le IQueryable était interrogation pour "ajouter" une ligne dans le IQueryable.

Rappelez-vous qu'un IQueryable n'est pas un résultat, c'est une requête. Jusqu'à ce que vous utilisez quelque chose comme .ToList () the IQueryable n'évaluera pas un jeu de résultats et plus important encore, L'IQueryable ne s'accroche pas à ce jeu de résultats. Il crée une liste et met les résultats dans la place. Cela signifie donc que si vous appelez ToList() sur un Iqueryable deux fois, il s'éteindra et interrogera la base de données deux fois. Il ne se soucie pas de qui il pourrait être inefficace.

donc, si vous regardez les exemples que d'autres ont utilisés ci-dessus, un simple changement D'AsEnumerable() en ToList() réglera très probablement vos problèmes.

quelque chose comme:

dcDataContext db = new dcDataContext();
var query = from c in db.tblSexes
              select new { c.SexCode, c.SexName };

var results = query.ToList().Concat(new[] { new { SexCode = -1, SexName = "Please select your Gender" } });

//or even better now that it's a list
var results = query.ToList().Add(new { SexCode = -1, SexName = "Please select your Gender" });

SelectList sliSex = new SelectList(results, "SexCode", "SexName");
4
répondu Jero 2009-02-18 03:21:30

Il pourrait être une très vieille question, je voudrais ajouter plus d'explication et exemple ici

si vous utilisez IQueryable<YourObject> , vous devez le convertir en IEnumerable<YourObject> premier

détail supplémentaire sur IEnumerable:

Returning IEnumerable < T> vs. IQueryable

par

IQueryable<YourObject> iqueryResult = // ..... your LinQ or whatever
IEnumerable<YourObject> enumResult = iqueryResult.AsEnumerable();

ensuite, pour ajouter, vous pouvez le faire par

enumResult = enumResult.Concat(new[] {new YourObject()
                 { 
                    //.... 
                 } 
             });

exemple de code réel

var iquery_QRDTR = from rrp in P_QCDTR
        select new WebRequestData
        {
             ros_chk_id = rrp.CHECKIN_ID,
             ros_img = rrp.EMPLOYEE_ASSOCIATE.IMAGE_URL
        };

var enum_QRDTR = iquery_QRDTR.AsEnumerable();

enum_QRDTR = enum_QRDTR.Concat(new[] {new WebRequestData()
             {
             ros_chk_id = 16,
             ros_img = "http://link.to.image/profile.jpg" 
             } });
3
répondu Sruit A.Suk 2017-05-23 10:31:33

essayez ceci:

var query = from c in db.clClinics select c; 

var results = query.ToList().Concat(new clClinic[] { new clClinic()});  
1
répondu ayman 2011-11-20 19:16:14

parce que les résultats sont IQueryable vous devriez jeter à elle

  dcDataContext db = new dcDataContext();
var results = from c in db.tblSexes
              select new { c.SexCode, c.SexName };
results = results.AsEnumerable().Concat(new[] { new { SexCode = -1, SexName = "Please select your Gender"} }).AsQueryable();
SelectList sliSex = new SelectList(results, "SexCode", "SexName");

ou sans aucun moulage

résultats = résultats.Union (nouveau[] { nouveau { SexCode = -1, SexName= " veuillez sélectionner votre Sexe"} })

0
répondu Dincer Uyav 2009-01-12 09:40:23

définit explicitement les propriétés pour les types anonymes. Essayez Ceci:

dcDataContext db = new dcDataContext();
var results = from c in db.tblSexes
              select new { c.SexCode, c.SexName };
results = results.AsEnumerable().Concat(new[] { new { SexCode = -1, SexName = "Please select your Gender"} });
SelectList sliSex = new SelectList(results, "SexCode", "SexName");

Edit: vous devez indiquer les types exacts de vos propriétés. Je veux dire, si c'est int, il faut le souligner. Je suppose que SexCode est un 'long' et par défaut -1 est un'int'. Si vous lancez -1 à long (ou le type de SexCode) le problème sera résolu.

Voici la solution exacte si le type de SexCode est long.

dcDataContext db = new dcDataContext();
var results = from c in db.tblSexes
              select new { c.SexCode, c.SexName };
results = results.Concat(new[] { new { SexCode = -1L, SexName = "Please select your Gender"} });
SelectList sliSex = new SelectList(results, "SexCode", "SexName");
0
répondu Ali Ersöz 2009-01-12 11:17:16