web-dev-qa-db-fra.com

C # Linq where clause comme variable

J'essaie de faire une déclaration LINQ où la clause where provient d'une variable. Par exemple:

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

Est-ce possible? Je n'arrive pas à le faire fonctionner.

merci,

Mise à jour - ma clause where est prédéfinie et sera basée sur l'entrée de l'utilisateur, donc je ne pense pas que cela fonctionnera pour moi. Fondamentalement, oùClause n'est pas construit dans la méthode, c'est un paramètre de la méthode qui fait le LINQ. Je n'ai pas bien expliqué que voici un meilleur exemple:

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

Mise à jour - Juste pour résumer certaines des suggestions et centraliser tout.

Je ne peux pas utiliser un commutateur pour générer la clause where car il existe de nombreuses possibilités.

Le message dynamique de linq que certains d'entre vous ont publié semble prometteur, mais j'ai du mal à relier l'exemple linq to sql à mon problème linq to objects.

et @sLaks après avoir parcouru msdn http://msdn.Microsoft.com/en-us/library/bb353734.aspx J'ai du mal à déterminer où vous vouliez utiliser AsQueryable

merci,

41
kds6253

Vous devez assembler un Expression<Func<T, bool>> Et le passer à la méthode d'extension Where():

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

EDIT : Si vous utilisez LINQ to Objects, supprimez le mot Expression pour créer un délégué ordinaire.

66
SLaks

Cette:

var query = from something in someList where whereClause;

est un raccourci pour:

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

En supposant que someList est un IEnumerable<Address>, Where fait référence à la méthode d'extension Enumerable.Where . Cette méthode attend un Func<Address, bool> que vous pouvez définir comme suit:

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

Comme l'a souligné Richard, la bibliothèque de requêtes dynamiques peut être utilisée pour créer des expressions de filtre dynamique. Lorsque vous utilisez Linq-To-Objects, assurez-vous de convertir votre IEnumerable<T> à un IQueryable<T> premier. Voici un exemple (incomplet):

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...  
  }
}
4
afrischke

C'est une fonction intégrée de LINQ. Utilisez simplement la méthode d'extension Where.

Voir Syntaxe de requête LINQ par rapport à la syntaxe de méthode (C #) pour plus d'informations.

1
Rob Windsor