Existe um padrão usando o Linq para criar dinamicamente um filtro?
-
09-06-2019 - |
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.
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')