2012-01-03 19 views
33

Estoy tratando de hacer una declaración LINQ donde la cláusula where proviene de una variable. Por ejemplo:C# Linq where cláusula como variable

string whereClause = address.zip == 23456; 
var x = from something in someList where whereClause; 

¿Esto es posible? Parece que no puedo hacer que funcione.

gracias,

Actualizar - mi cláusula where está predefinida y se basará en la entrada del usuario, así que no creo que esto funcionará para mí. Básicamente, whereClause no está construido en el método, es un parámetro del método que hace el LINQ. No explico tan bien aquí hay un mejor ejemplo:

public void doLnq(string whereClause) 
{ 
    var x = from something in someList where whereClause; 
    dowork(x); 
} 

Actualización - Solo para resumir algunas de las sugerencias y centralizar todo.

No puedo usar un interruptor para generar la cláusula where porque hay muchas posibilidades.

La publicación dinámica de linq que algunos de ustedes han publicado parece prometedora pero tengo problemas para relacionar el ejemplo de linq a sql con mi problema de linq to objects.

y @sLaks después de mirar a través de MSDN http://msdn.microsoft.com/en-us/library/bb353734.aspx Estoy teniendo problemas para averiguar dónde nos referimos a utilizar AsQueryable

gracias,

+0

Er, no. La cláusula where es * * no * una cadena, es una expresión que devuelve un booleano. Excepto ... ¡mira el enlace de SLaks! – sq33G

+0

@ sq33G la cadena en esta situación sería "address.zip == 23456" Me gustaría utilizar at como la expresión. La cadena proviene de la entrada del usuario para que puedan hacer búsquedas personalizadas. ¿Tiene sentido? – kds6253

+0

Supongo que el usuario elige el campo (campo == valor) de un menú desplegable. Entonces, probablemente pueda usar una instrucción switch para construir un Func para enviar como un delegado Where. – sq33G

Respuesta

49

Es necesario el montaje de un Expression<Func<T, bool>> y lo pasa al método Where() extensión:

Expression<Func<T, bool>> whereClause = a => a.zip == 23456; 
var x = frSomeList.Where(whereClause); 

EDITAR: Si está utilizando LINQ a objetos, eliminar la palabra Expression para crear una n delegado ordinario.

+1

Con una etiqueta 'linq-to-objects', would a * Expresión * ser apropiado? –

+0

, consulte la actualización – kds6253

+0

@ kds6253: A continuación, puede tomar un delegado como parámetro. Si necesita usar una cadena, puede usar LINQ dinámico (pero será más lento) – SLaks

9

Este:

var query = from something in someList where whereClause; 

es la abreviatura de:

var query = someList.Where(something => whereClause); 

Suponiendo someList es un IEnumerable<Address>, Where se refiere a la Enumerable.Where Extension Method. Este método espera un Func<Address, bool> que se puede definir de la siguiente manera:

Func<Address, bool> whereClause = address => address.Zip == 23456; 
var query = someList.Where(whereClause); 
+0

Consulte la actualización – kds6253

0

Si desea definir una cláusula Where en tiempo de ejecución, debe utilizar una consulta dinámica.

de Scott Gu escribió un gran post sobre ello aquí: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Espero que ayude.

+0

. He revisado esta publicación anteriormente y no veo cómo aplicarla a mi situación. Soy relativamente nuevo en esto, así que por favor tengan paciencia conmigo. El ejemplo que usó es para linq a Sql, y la fuente de datos es la base de datos de Northwind. ¿Cómo puedo cambiar esto para que funcione con mi problema Linq to Object? Una vez que vuelvo a apreciar la ayuda. – kds6253

3

Como ha señalado Richard, la Biblioteca de consultas dinámicas se puede usar para crear expresiones de filtros dinámicos. Cuando utilice Linq-To-Objects, asegúrese de convertir primero su IEnumerable<T> a IQueryable<T>.Aquí hay un ejemplo (incompleto):

using System.Linq.Dynamic; 

namespace System.Linq.Dynamic 
{ 
    public class Example 
    { 
    // Assuming some value is assigned to below field somewhere... 
    private IEnumerable<Address> m_Addresses; 

    public void FilterByZipCode(string zipCode) 
    { 
     var x = m_Addresses.AsQueryable().Where("Zip == @0", zipCode); 
     dowork(x); 
    } 
    } 

    public class Address 
    { 
    public String Zip { get; set; } 

    // More Properties... 
    } 
} 
Cuestiones relacionadas