c# - valores - tipos de funciones en sql server
¿equivalente lineal de ''seleccionar*'' sql para la función genérica? (5)
Dispara, escribiste exactamente lo que iba a publicar. Solo estaba preparando un código: /
Es un poco complicado pero de todos modos:
ClientCollection coll = new ClientCollection();
var results = coll.Select(c =>
{
Dictionary<string, object> objlist = new Dictionary<string, object>();
foreach (PropertyInfo pi in c.GetType().GetProperties())
{
objlist.Add(pi.Name, pi.GetValue(c, null));
}
return new { someproperty = 1, propertyValues = objlist };
});
Tengo una función genérica <> que toma una consulta de linq (''elementos'') y la enumera añadiendo propiedades adicionales. ¿Cómo puedo seleccionar todas las propiedades del ''elemento'' original en lugar del elemento en sí (como lo hace el código siguiente)?
Tan equivalente a sql: select *, ''bar'' como Foo de los elementos
foreach (var item in items)
{
var newItem = new {
item, // I''d like just the properties here, not the ''item'' object!
Foo = "bar"
};
newItems.Add(newItem);
}
No hay una manera fácil de hacer lo que estás sugiriendo, ya que todos los tipos en C # son de tipo fuerte, incluso los anónimos que estás usando. Sin embargo, no es imposible llevarlo a cabo. Para hacerlo, debería utilizar la reflexión y emitir su propio ensamblaje en la memoria, agregando un nuevo módulo y tipo que contiene las propiedades específicas que desea. Es posible obtener una lista de propiedades de su artículo anónimo usando:
foreach(PropertyInfo info in item.GetType().GetProperties())
Console.WriteLine("{0} = {1}", info.Name, info.GetValue(item, null));
Pídele al objeto que se los dé.
La reflexión es de una sola manera ... sin embargo, dado que todas las propiedades se conocen en tiempo de compilación, cada elemento podría tener un método que ayude a esta consulta a obtener lo que necesita.
Aquí hay algunas firmas de métodos de ejemplo:
public XElement ToXElement()
public IEnumerable ToPropertyEnumerable()
public Dictionary<string, object> ToNameValuePairs()
from item in items
where someConditionOnItem
select
{
propertyOne,
propertyTwo
};
Supongamos que tiene una colección de clase de departamento:
public int DepartmentId { get; set; }
public string DepartmentName { get; set; }
Luego usa un tipo anónimo como este:
List<DepartMent> depList = new List<DepartMent>();
depList.Add(new DepartMent { DepartmentId = 1, DepartmentName = "Finance" });
depList.Add(new DepartMent { DepartmentId = 2, DepartmentName = "HR" });
depList.Add(new DepartMent { DepartmentId = 3, DepartmentName = "IT" });
depList.Add(new DepartMent { DepartmentId = 4, DepartmentName = "Admin" });
var result = from b in depList
select new {Id=b.DepartmentId,Damartment=b.DepartmentName,Foo="bar" };