Selección de columna dinámica en linq
seleccionar dinámicamente una columna específica en una consulta LINQ puede ser un desafío cuando la columna se desconoce en el momento de la compilación. Sin embargo, existe una solución que implica la creación dinámica de las expresiones lambda pasadas para seleccionar.
Considere la siguiente clase de datos:
public class Data
{
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
public string Field4 { get; set; }
public string Field5 { get; set; }
}
Para seleccionar dinámicamente columnas específicas, puede usar el método CreateNewStatement para crear una expresión lambda dinámicamente:
private Func CreateNewStatement(string fields)
{
var xParameter = Expression.Parameter(typeof(Data), "o");
var xNew = Expression.New(typeof(Data));
var bindings = fields.Split(',')
.Select(o => o.Trim())
.Select(o =>
{
var mi = typeof(Data).GetProperty(o);
var xOriginal = Expression.Property(xParameter, mi);
return Expression.Bind(mi, xOriginal);
});
var xInit = Expression.MemberInit(xNew, bindings);
var lambda = Expression.Lambda>(xInit, xParameter);
return lambda.Compile();
}
Este método toma una lista de campos separada por comas como una cadena y genera dinámicamente una expresión de lambda que inicializa un nuevo objeto de datos con el campo especificado.
puede usar el método CreateNewStatement para crear una expresión lambda y pasarla para seleccionar:
var result = list.Select(CreateNewStatement("Field1, Field2"));
esto devolverá una secuencia de objetos de datos con el campo especificado poblado. Tenga en cuenta que esta técnica es adecuada para situaciones en las que el campo seleccionado no se conoce en el momento de la compilación. Si el campo seleccionado es estático, es más eficiente usar expresiones lambda regulares o métodos basados en la reflexión.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3