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.
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)" });
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.
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");
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:
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"
} });
essayez ceci:
var query = from c in db.clClinics select c;
var results = query.ToList().Concat(new clClinic[] { new clClinic()});
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"} })
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");