2008-08-27 6 views

Respuesta

19

Mira la Dynamic Linq Library del blog de ScottGu:

Por ejemplo, a continuación se LINQ estándar de seguridad de tipos de consulta SQL VB que recupera datos de una base de datos Northwind y lo muestra en un control GridView ASP.NET:

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() 

el uso de la biblioteca de LINQ DynamicQuery pude volver a escribir la expresión de consulta anterior en lugar al igual que

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

Aviso cómo el cláusula condicional-where y cláusula sort-orderby ahora toman expresiones de cadena en lugar de expresiones de código. Debido a que son cadenas atadas tardíamente, puedo construirlas dinámicamente. Por ejemplo: podría proporcionar UI a un analista de negocios de usuario final usando mi aplicación que les permite construir consultas por sí mismos (incluidas cláusulas condicionales arbitrarias).

+0

¿Funciona? Me sale esto: Error Resolución de sobrecarga fallida porque no se puede llamar a 'OrderBy' accesible con estos argumentos: El tipo (s) de datos de los parámetros de tipo no se pueden inferir a partir de estos argumentos. Especificar los tipos de datos explícitamente podría corregir este error. No puedo ver 'Cadena' como una opción de parámetro en la cláusula .OrderBy. – JohnnyBizzle

+0

@JohnnyBizzle - Funciona. Lo uso en muchos proyectos. Verifica que dynamic.cs esté en tu proyecto y que lo hagas referenciado correctamente en tus declaraciones de uso. – Geoff

+0

Eso es genial. Nunca supe que pudieras hacer eso. Eso resolverá mi problema con la construcción de consultas de búsqueda avanzada. Nice one +1 – ppumkin

2

algo como esto?

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

que crearía una instrucción SQL como

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

Concepto interesante pero un poco confuso – ppumkin

9

dinámico LINQ es un camino a seguir.

Puede ser excesivo para su situación. Considere:

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(); 
Cuestiones relacionadas