2008-08-27 9 views

Répondre

19

Vérifiez la Dynamic Linq Library du blog de ScottGu:

Par exemple, ci-dessous est un LINQ de type sécurisé standard pour requête SQL VB qui récupère des données à partir d'une base de données Northwind et il affiche dans un contrôle ASP.NET GridView:

Dim Northwind As New NorthwindDataContext 
Dim query = From q In Northwind.Products Where p.CategoryID = 2 And p.UnitPrice > 3 Order By p.SupplierID Select p 

Gridview1.DataSource = query 
GridView1.DataBind() 

Utilisation de la bibliothèque LINQ DynamicQuery je pourrais réécrire l'expression de requête ci-dessus à la place comme si

Dim Northwind As New NorthwindDataContext 
Dim query = Northwind.Products .where("CategoryID=2 And UnitPrice>3") . OrderBy("SupplierId") 
Gridview1.DataSource = query 
GridView1.DataBind() 

Remarquez comment la condition-where où la clause sort-orderby prend maintenant des expressions de chaîne au lieu des expressions de code. Parce que ce sont des chaînes liées en retard, je peux les construire dynamiquement. Par exemple: Je pourrais fournir l'interface utilisateur à un analyste d'affaires de l'utilisateur final en utilisant mon application qui leur permet de construire des requêtes par eux-mêmes (y compris des clauses conditionnelles arbitraires).

+0

Est-ce que cela fonctionne? J'obtiens ceci: Erreur La résolution de surcharge a échoué parce qu'aucun 'OrderBy' accessible ne peut être appelé avec ces arguments: Le (s) type (s) de données du (des) paramètre (s) de type ne peuvent pas être déduits de ces arguments. Spécifier le (s) type (s) de données explicitement pourrait corriger cette erreur. Je ne peux pas voir 'String' comme une option de paramètre dans la clause .OrderBy. – JohnnyBizzle

+0

@JohnnyBizzle - Cela fonctionne. Je l'utilise dans de nombreux projets. Vérifiez que le fichier dynamic.cs figure dans votre projet et que vous l'avez correctement référencé dans vos déclarations d'utilisation. – Geoff

+0

C'est génial. Je n'ai jamais su que tu pouvais faire ça. Cela résoudra mon problème avec la construction de requêtes de recherche avancée. Nice one +1 – ppumkin

2

quelque chose comme ça?

var myList = new List<string> { "a","b","c" }; 
var items = from item in db.Items 
      where myList.Contains(item.Name) 
      select item; 

qui créerait une instruction SQL comme

SELECT * FROM Items [t0] where Name IN ('a','b','c') 
+1

Concept intéressant mais un peu déroutant – ppumkin

9

Dynamic Linq est une façon d'aller.

Il peut être trop lourd pour votre scénario. Considérez:

IQueryable<Customer> query = db.Customers; 

if (searchingByName) 
{ 
    query = query.Where(c => c.Name.StartsWith(someletters)); 
} 
if (searchingById) 
{ 
    query = query.Where(c => c.Id == Id); 
} 
if (searchingByDonuts) 
{ 
    query = query.Where(c => c.Donuts.Any(d => !d.IsEaten)); 
} 
query = query.OrderBy(c => c.Name); 
List<Customer> = query.Take(10).ToList(); 
Questions connexes