Estamos trabalhando em um Log Viewer. O uso terá a opção de filtrar por usuário, gravidade, etc. Na época do Sql eu adicionaria à string de consulta, mas quero fazer isso com o Linq. Como posso adicionar cláusulas where condicionalmente?
c#
linq
linq-to-sql
.net-3.5
sgwill
fonte
fonte
LINQ to Entities does not recognize the method 'System.String get_Item(System.String)' method, and this method cannot be translated into a store expression.
Se você precisar filtrar com base em uma lista / matriz, use o seguinte:
fonte
Terminei usando uma resposta semelhante à de Daren, mas com uma interface IQueryable:
Isso cria a consulta antes de chegar ao banco de dados. O comando não será executado até .ToList () no final.
fonte
Quando se trata de linq condicional, gosto muito do padrão de filtros e tubos.
http://blog.wekeroad.com/mvc-storefront/mvcstore-part-3/
Basicamente, você cria um método de extensão para cada caso de filtro que leva em IQueryable e um parâmetro.
fonte
Resolvi isso com um método de extensão para permitir que LINQ seja habilitado condicionalmente no meio de uma expressão fluente. Isso elimina a necessidade de dividir a expressão com
if
instruções..If()
método de extensão:Isso permite que você faça o seguinte:
Esta é também uma
IEnumerable<T>
versão que irá lidar com a maioria das outras expressões LINQ:fonte
Outra opção seria usar algo como o PredicateBuilder discutido aqui . Ele permite que você escreva um código como o seguinte:
Observe que eu só tenho isso para funcionar com o Linq 2 SQL. EntityFramework não implementa Expression.Invoke, que é necessário para que este método funcione. Eu tenho uma pergunta sobre este assunto aqui .
fonte
Fazendo isso:
tendo isso na
where
declaração:significa que quando a consulta final é criada, se
lastNameSearch
for,false
a consulta omitirá completamente qualquer SQL para a pesquisa de sobrenome.fonte
Não é a coisa mais bonita, mas você pode usar uma expressão lambda e passar suas condições opcionalmente. No TSQL, faço muitas das seguintes ações para tornar os parâmetros opcionais:
Você pode duplicar o mesmo estilo com o seguinte lambda (um exemplo de verificação de autenticação):
fonte
Eu tive um requisito semelhante recentemente e finalmente encontrei isso no MSDN. Amostras CSharp para Visual Studio 2008
As classes incluídas na amostra DynamicQuery do download permitem que você crie consultas dinâmicas em tempo de execução no seguinte formato:
Usando isso, você pode construir uma string de consulta dinamicamente em tempo de execução e passá-la para o método Where ():
fonte
Você pode criar e usar este método de extensão
fonte
Basta usar o operador && do C #:
Edit: Ah, preciso ler com mais atenção. Você queria saber como adicionar cláusulas adicionais condicionalmente . Nesse caso, não tenho ideia. :) O que eu provavelmente faria seria apenas preparar várias consultas e executar a correta, dependendo do que eu acabasse precisando.
fonte
Você pode usar um método externo:
Isso funcionaria, mas não pode ser dividido em árvores de expressão, o que significa que o Linq to SQL executaria o código de verificação em cada registro.
Alternativamente:
Isso pode funcionar em árvores de expressão, o que significa que Linq para SQL seria otimizado.
fonte
Bem, pensei que você poderia colocar as condições do filtro em uma lista genérica de Predicados:
Isso resulta em uma lista contendo "me", "meyou" e "mow".
Você poderia otimizar isso fazendo o foreach com os predicados em uma função totalmente diferente que executa o OR de todos os predicados.
fonte