2010-01-27 35 views
6

En primer lugar, disculpas por la mala título de la pregunta - no del todo seguro si estoy haciendo la cosa correcta.¿Cómo hacer referencia a un campo en LINQ basado en un nombre de campo dinámico

Normalmente se puede hacer lo siguiente para acceder a un campo:

MyTables table = dc.MyTables.SingleOrDefault(p => p.id == someId); 
somevalue = table.samplefield; 

En este caso la variable somevalue podría llegar a tener el valor del campo samplefield.

Ahora tengo un escenario en el que quiero llenar una variable, pero no sé el nombre del campo de la tabla en el momento del diseño. Sin embargo, tengo este nombre de campo en una cadena. Por lo tanto, ¿es posible obtener un valor usando esta cadena?

¡Espero que esto tenga sentido!

+0

¿Qué sabe usted - "id", o "campo de muestra"? –

+0

@Marc: sampleField – Martin

Respuesta

5

Es necesario utilizar la reflexión, así: (no probado)

somevalue = typeof(MyTable).GetProperty(fieldName).GetValue(table, null); 
2

Para hacer esto, necesitará usar la reflexión.

public object GetField(object obj, string fieldName) { 
    var t = obj.GetType(); 
    var field = t.GetField(fieldName); 
    return field.GetValue(obj); 
} 

somevalue = GetField(table, "someFieldName"); 

Esto funciona siempre que el campo sea tanto de instancia como público. Tendría que modificar ligeramente la llamada al método GetField si la accesibilidad fuera inferior a la pública.

+0

¿Realmente LINQ to SQL usa campos y no propiedades? – SLaks

+0

@Slaks, ni idea, pero el OP dijo campo dentro de la pregunta, así que fui con el campo. – JaredPar

2

En definitiva, es factible, pero se pone mucho más complicado. Si quieres hacer una consulta LINQ completamente dinámica, deberías consultar estas publicaciones de Scott Hanselman.

+0

Después de ver todas las respuestas definitivamente me perdí el bote. LINQ no es necesario para este escenario en absoluto.Los métodos de reflexión que se muestran aquí son exactamente lo que necesita. – smaclell

3

Si tiene string s = "sampleField";, a continuación, puedes utilizar la reflexión:

object value = table.GetType().GetProperty(s).GetValue(table, null); 

Si necesita el PKID como una cadena, es más complejo y necesita usar un lambda generado en tiempo de ejecución. Exactamente cómo depende un poco de la implementación; por ejemplo, para identificar el PK de LINQ-a-SQL, consulte this answer que examina los metadatos de contextos de datos.

2

Weirdly Acabo de leer algo similar en el blog de Scott Hanselman, esto es para establecer el lugar u ordenando por un nombre de campo en una cadena, pero creo que la selección se puede hacer de la misma manera. Ver:

http://www.hanselman.com/blog/TheWeeklySourceCode48DynamicQueryableMakesCustomLINQExpressionsEasier.aspx

El núcleo de ser algo así como:

Dim Northwind As new NorthwindDataContext 
Dim query = Northwind.Products 
     .Where("CategoryID=2 And UnitPrice>3") 
     .OrderBy("SupplierID") 
GridView1.DataSource = query 
GridView1.DataBind() 

Se puede requerir algunas referencias de datos dinámicos.

+0

Me gusta más esta solución que la reflexión porque funcionará con IQueryables como Linq en SQL –

Cuestiones relacionadas