c# - example - scottgu dynamic linq
Seleccione el tipo anĂ³nimo con Dynamic Expression API (2)
Estoy usando Dynamic Expression API ( System.Linq.Dynamic
) con LINQ to Entities. Mi consulta LINQ está debajo.
var query = this.db.Products.AsQueryable()
.Where(strCondition)
.OrderBy("ProductNumber")
.Select("new(ProductNumber, ProductDescription, ProductCategory.Name)");
Ahora que tengo la "consulta", no sé cómo obtener el valor de cada uno de los campos.
string strTemp;
foreach (var item in query)
{
strTemp = item.?
}
Es de tipo anónimo, así que no puedo usar el tipo fuertemente para obtener el valor. ¿Que puedo hacer? La razón por la que selecciono obtener campos de tipo anónimos es porque necesito ingresar el campo ProductCategory.Name en el resultado. ¿Hay alguna forma mejor de obtener ProductCategory.Name en el resultado con Dynamic Expression API? ¿Alguien puede ayudar?
La forma más fácil de resolverlo es declarar su variable de bucle como dynamic
ya que no tiene ninguna información de tipo estático (el tipo estático inferido es object
pero es una instancia de una clase dynamic
).
foreach (dynamic item in query)
{
string ProductNumber = item.ProductNumber;
string ProductDescription = item.ProductDescription;
string Name = item.Name;
}
De lo contrario, puede usar la reflexión manualmente.
// static (extension) method to read the property
public static T GetProperty<T>(this DynamicClass self, string propertyName)
{
var type = self.GetType();
var propInfo = type.GetProperty(propertyName);
return (T)propInfo.GetValue(self, null);
}
// usage:
foreach (DynamicClass item in query)
{
// using as an extension method
string ProductNumber = item.GetProperty<string>("ProductNumber");
// or as a static method
string ProductDescription = GetProperty<string>(item, "ProductDescription");
string Name = item.GetProperty<string>("Name");
}
Simplemente use el nombre de propiedad que ha usado para crear su objeto anónimo. VS intellisense debería recogerlos.
string strTemp;
foreach (var item in query)
{
strTemp = item.ProductItem;
}
Puede especificar sus propios nombres de propiedad también:
.Select("new(ProductNumber as Number, ProductDescription as Description, ProductCategory.Name as Name)")