mvc inside example ejemplos custom linq iqueryable

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:

Devolver IEnumerable <T> frente a IQueryable <T>

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" } });