2011-10-21 11 views
9

Busco manera de conseguir algo como esto:Marco de la entidad que proporciona los nombres de columna como variable de cadena

string _col1 = "first name"; 
string _name; 
var query = from c in ctx.Customers select c; 
_name = query.FirstOrDefault().[_name]; 

Por lo que yo puedo ver que sólo se puede conseguir con establecimiento inflexible nombres de campo, pero me gustaría proporcionar ellos como variables de cadena.

+1

te refieres a la selección de la columna o el filtrado por esa columna? En su ejemplo, no está utilizando _col1 después de asignarlo. Por favor especifique ... – AJC

+0

Tengo que poner el nombre de la columna basado en el valor de la cadena de la lista de cadenas para que no sea para filtrar – Andy

Respuesta

19

No estoy seguro si EF le proporciona una forma de obtener un valor de propiedad basado en el nombre de cadena de la propiedad, pero puede usar la reflexión.

string name = typeof(Customer) 
    .GetProperty("first name") 
    .GetValue(query.First(), null) as string; 

Supongo que la clase de EF que está tratando con Customer se llama.

+1

Funciona perfecto, ¡Gracias a todos! – Andy

+0

Me alegra que esté funcionando. Por favor marque la respuesta como la respuesta correcta. Gracias. –

+0

error al obtener una colección de elementos en lugar de solo uno. – Matt

4

Es necesario utilizar el reflejo para esto. Si usted está tratando de filtrar por una columna dinámicamente seleccionado, puede intentar algo como esto:

string propertyName 
string keyword 

ParameterExpression parameter = Expression.Parameter(typeof(YourType), "x"); 
Expression property = Expression.Property(parameter, propertyName); 
Expression target = Expression.Constant(keyword); 
Expression containsMethod = Expression.Call(property, "Contains", null, target); 
Expression<Func<YourType, bool>> lambda = 
    Expression.Lambda<Func<YourType, bool>>(containsMethod, parameter); 

var companies = repository.AsQueryable().Where(lambda); 

que lo que está tratando de hacer es seleccionar una columna en particular, entonces se puede utilizar el mismo principio para generar la lamba expresión y usarlo en la selección (menos la condición)

var companies = repository.AsQueryable().Where(whatever).Select(lambda); 
+0

¿hay alguna referencia para esto? ¿Qué significa "x"? – Matt

+0

@Matt "x" es para la expresión lambda, como en 'x => x.Property' podría ser cualquier cosa. La referencia, obtuve de una pregunta que hice, http://stackoverflow.com/questions/7246715/use-reflection-to-get-lambda-expression-from-property-name. – AJC

0

Por alguna razón no funcionará para mí.

Esa es mi solución de trabajo similar:

string name = null; 

// Select the PropertyInfo of the column. 
PropertyInfo propertyInfo = query.First().GetType().GetProperty("first name"); 

if (propertyInfo != null) 
{ 
    try 
    { 
    // Select the content of the column. 
    name = pi.GetValue(query.First(), null).ToString(); 
    } 
    catch (Exception) 
    { 
    // Continue with null-string. 
    } 

}

Cuestiones relacionadas