Pergunta

Existe um padrão usando o Linq para criar dinamicamente um filtro?

Eu tenho necessidade de criar filtragem personalizada em uma lista, no passado, gostaria apenas de criar dinamicamente o SQL...não, parece que isso é possível com o Linq.

Foi útil?

Solução

Confira o Dinâmica Linq Biblioteca a partir do ScottGu do blog:

Por exemplo, abaixo é um padrão de segurança do tipo LINQ to SQL, VB consulta que recupera dados de um banco de dados Northwind e o exibe em uma ASP.NET controle 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()

Usando o LINQ DynamicQuery biblioteca, eu poderia re-escrever o acima expressão de consulta em vez assim

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

Observe como o condicional-cláusula where e ordenar-cláusula orderby agora pegue expressões de seqüência de caracteres em vez de código de expressões.Porque eles são tardia cadeias de caracteres podem construir dinamicamente-los.Por exemplo:Eu poderia fornecer a INTERFACE do usuário para um usuário final analista de negócios usando a minha aplicação que permite construir consultas por conta própria (incluindo arbitrário orações condicionais).

Outras dicas

Dinâmica do Linq é uma maneira de ir.

Pode ser um exagero para o seu cenário.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();

algo como isso?

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

que iria criar uma instrução sql como

SELECT * FROM Items [t0] where Name IN ('a','b','c')
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top