linq - inside - ¿Cómo agrego un nuevo registro a una variable IQueryable?
linq custom provider (7)
¿Desea agregarlo a la base de datos, o simplemente a la lista de resultados que usarán otras cosas como el enlace de datos?
Si es el primero, deberá usar la operación de adición normal para cualquier tipo de LINQ que esté utilizando, pero para la representación de tabla en lugar de IQueryable. Las consultas solo leen datos.
Si es el último, utilice Enumerable.Concat para concatenar su secuencia existente (IQueryable) con una nueva que contenga sus entradas adicionales (una matriz sería adecuada aquí, o una lista), y use el resultado para vincular etc. Probablemente valga la pena utilizando AsEnumerable () primero para asegurarse de que se utiliza Enumerable en lugar de Queryable. Por ejemplo:
IQueryable<string> names = [...];
names = names.AsEnumerable().Concat(new[] { "(None)", "(Add new)" });
Los resultados de IQueryable se consultan desde mi base de datos utilizando LINQ, ¿cómo agrego un nuevo registro al resultado de IQueryable?
Dado que los resultados son IQueryable, deberías lanzarlos
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");
O sin ningún casting
results = results.Union (new [] {new {SexCode = -1, SexName = "Seleccione su Género"}})
Establecer propiedades explícitamente para tipos anónimos. Prueba esto:
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");
Editar: debe señalar los tipos exactos de sus propiedades. Quiero decir, si es int tienes que señalar que lo es. Supongo que SexCode es un ''largo'' y por defecto -1 es un ''int''. Si lanzas -1 a largo (o el tipo de SexCode), el problema se resolverá.
Aquí está la solución exacta si el tipo de SexCode es largo.
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");
La respuesta simple es que a menos que agregue el registro al almacén de datos subyacente que el Iqueryable está consultando, no puede agregar un nuevo registro en un IQueryable. Por lo tanto, si está utilizando LinqToSql, deberá agregar una fila en la tabla que IQueryable estaba consultando para "agregar" una fila en IQueryable.
Recuerde que un IQueryable no es un conjunto de resultados, es una consulta. Hasta que utilice algo como .ToList (), IQueryable no evaluará un conjunto de resultados y, lo que es más importante, IQueryable no se mantendrá en ese conjunto de resultados. Crea una lista y coloca los resultados en su lugar. Entonces, eso significa que si llama a ToList () en un Iqueryable dos veces, se activará y consultará la base de datos dos veces. No importa que pueda ser ineficiente.
Entonces, si observa los ejemplos que otros han usado anteriormente, un simple cambio de AsEnumerable () a ToList () probablemente solucionará sus problemas.
Algo como:
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");
Prueba esto:
var query = from c in db.clClinics select c;
var results = query.ToList().Concat(new clClinic[] { new clClinic()});
Primero debes convertirlo a List;
IQueryable<int> foo = new SomeQueryable<int<();
List<int> list = foo.ToList();
list.Add(5);
o usando Concat
IQueryable<int> foo = new SomeQueryable<int<();
foo = foo.Concat(new int[]{5});
EDITAR: seguro que debes reasignar a foo.
Puede ser una pregunta muy antigua, me gustaría agregar más explicaciones y ejemplos aquí
si usa IQueryable<YourObject>
, IQueryable<YourObject>
debe convertirlo a IEnumerable<YourObject>
detalle adicional sobre IEnumerable:
por
IQueryable<YourObject> iqueryResult = // ..... your LinQ or whatever
IEnumerable<YourObject> enumResult = iqueryResult.AsEnumerable();
luego, para agregar puedes hacerlo
enumResult = enumResult.Concat(new[] {new YourObject()
{
//....
}
});
muestra de código real
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"
} });