Encontrei um exemplo no VS2008 Examples for Dynamic LINQ que permite que você use uma string do tipo sql (por exemplo, OrderBy("Name, Age DESC"))
para fazer pedidos. Infelizmente, o método incluído apenas funciona IQueryable<T>
. Existe alguma maneira de obter essa funcionalidade IEnumerable<T>
?
c#
linq
linq-to-objects
John Sheehan
fonte
fonte
Respostas:
Apenas tropeçou neste velho ...
Para fazer isso sem a biblioteca dinâmica LINQ, você só precisa do código abaixo. Isso abrange os cenários mais comuns, incluindo propriedades aninhadas.
Para fazê-lo funcionar,
IEnumerable<T>
você pode adicionar alguns métodos de wrapper,AsQueryable
mas o código abaixo é aExpression
lógica principal necessária.Edit: fica mais divertido se você quiser misturar isso
dynamic
- embora note que issodynamic
só se aplica a LINQ-to-Objects (as árvores de expressão para ORMs etc não podem realmente representardynamic
consultas -MemberExpression
não é compatível). Mas aqui está uma maneira de fazer isso com o LINQ-to-Objects. Observe que a escolha deHashtable
é devido à semântica de bloqueio favorável:fonte
IQueryable<T>
, portanto, se você tem algo comoList<T>
(o que éIEnumerable<T>
), pode precisar usarAsQueryable()
- por exemplovar sorted = someList.AsQueryable().OrderBy("Foo.Bar");
Muito fácil sem qualquer complicação:
using System.Linq.Dynamic;
no topo.vehicles = vehicles.AsQueryable().OrderBy("Make ASC, Year DESC").ToList();
fonte
System.Linq.Dynamic
?Eu encontrei a resposta. Posso usar o
.AsQueryable<>()
método de extensão para converter minha lista em IQueryable e executar a ordem dinâmica nela.fonte
Apenas tropeçou nesta questão.
Usando a implementação ApplyOrder de Marc de cima, juntei um método Extension que lida com seqüências semelhantes a SQL, como:
Detalhes podem ser encontrados aqui: http://aonnull.blogspot.com/2010/08/dynamic-sql-like-linq-orderby-extension.html
fonte
Eu acho que funcionaria usar a reflexão para obter qualquer propriedade que você deseja classificar:
Observe que o uso da reflexão é consideravelmente mais lento do que o acesso direto à propriedade, portanto, o desempenho precisaria ser investigado.
fonte
Apenas construindo sobre o que os outros disseram. Eu descobri que o seguinte funciona muito bem.
fonte
Eu tropecei nesta pergunta procurando por várias cláusulas de ordenação do Linq e talvez fosse isso que o autor estava procurando
Veja como fazer isso:
fonte
Eu estava tentando fazer isso, mas estava tendo problemas com a solução da Kjetil Watnedal porque não uso a sintaxe linq inline - prefiro a sintaxe no estilo de método. Meu problema específico estava em tentar fazer a classificação dinâmica usando um costume
IComparer
.Minha solução acabou assim:
Dada uma consulta IQueryable da seguinte maneira:
E dado um argumento de campo de classificação em tempo de execução:
O dinâmico OrderBy tem a seguinte aparência:
E isso está usando um pequeno método auxiliar chamado GetReflectedPropertyValue ():
Uma última coisa - mencionei que queria
OrderBy
usar personalizadoIComparer
- porque queria fazer a classificação Natural .Para fazer isso, basta alterar o
OrderBy
para:Veja esta postagem para o código de
NaturalSortComparer()
.fonte
Use dinâmico
linq
basta adicionar
using System.Linq.Dynamic;
E use-o assim para ordenar todas as suas colunas:
fonte
Você pode adicioná-lo:
A
GetPropertyValue
função é da resposta de Kjetil WatnedalA questão seria por quê? Qualquer tipo desse lançaria exceções em tempo de execução, em vez de tempo de compilação (como a resposta do D2VIANT).
Se você estiver lidando com o Linq to Sql e o orderby for uma árvore de expressão, ele será convertido em SQL para execução de qualquer maneira.
fonte
OrderBy
não mantenha a ordem anterior !!Aqui está outra coisa que achei interessante. Se sua fonte for uma DataTable, você poderá usar a classificação dinâmica sem usar o Dynamic Linq
referência: http://msdn.microsoft.com/en-us/library/bb669083.aspx (Using DataSetExtensions)
Aqui está mais uma maneira de fazer isso convertendo-o em um DataView:
fonte
Graças a Maarten ( consulte uma coleção usando o objeto PropertyInfo no LINQ ), obtive esta solução:
No meu caso, eu estava trabalhando em um "ColumnHeaderMouseClick" (WindowsForm), apenas encontrei a coluna específica pressionada e seu correspondente PropertyInfo:
OU
(certifique-se de que os nomes da coluna correspondam às propriedades do objeto)
Felicidades
fonte
Depois de muita pesquisa, isso funcionou para mim:
fonte
Você pode converter o IEnumerable em IQueryable.
fonte
Uma solução alternativa usa a seguinte classe / interface. Não é verdadeiramente dinâmico, mas funciona.
fonte
Esta resposta é uma resposta aos comentários que precisam de um exemplo para a solução fornecida por @John Sheehan - Runscope
no DAL (camada de acesso a dados),
A versão IEnumerable:
A versão IQueryable
Agora você pode usar a versão IQueryable para vincular, por exemplo, GridView no Asp.net e se beneficiar da classificação (você não pode classificar usando a versão IEnumerable)
Usei o Dapper como ORM e criei a versão IQueryable e utilizei a classificação no GridView no asp.net tão fácil.
fonte
Primeiro instale ferramentas dinâmicas -> Gerenciador de Pacotes NuGet -> Console do Gerenciador de Pacotes
Adicionar espaço para nome
using System.Linq.Dynamic;
Agora você pode usar
OrderBy("Name, Age DESC")
fonte
Você pode usar isto:
fonte
Converta a lista em IEnumerable ou Iquerable, adicione usando o espaço para nome System.LINQ.Dynamic e, em seguida, você pode mencionar os nomes de propriedades na sequência separada por vírgulas no método OrderBy, que vem por padrão de System.LINQ.Dynamic.
fonte
fonte