Eu tenho uma consulta como esta
(from u in DataContext.Users
where u.Division == strUserDiv
&& u.Age > 18
&& u.Height > strHeightinFeet
select new DTO_UserMaster
{
Prop1 = u.Name,
}).ToList();
Quero adicionar as várias condições, como idade, altura com base no fato de essas condições terem sido fornecidas ao método que executa esta consulta. Todas as condições incluirão a Divisão do usuário. Se a idade foi fornecida, desejo adicioná-la à consulta. Da mesma forma, se a altura for fornecida, quero adicioná-la também.
Se isso fosse feito usando consultas sql, eu teria usado o construtor de strings para anexá-las à consulta strSQL principal. Mas aqui no Linq eu só consigo pensar em usar uma condição IF onde escreverei a mesma consulta três vezes, com cada bloco IF tendo uma condição adicional. Existe uma maneira melhor de fazer isso?
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.
Eu geralmente uso o encadeamento de métodos, mas tenho o mesmo problema. E aqui está a extensão que uso
Ajuda a evitar quebras de corrente. Também são iguais
ConditionalOrderBy
eConditionalOrderByDescending
úteis.fonte
uma opção.
ou você pode mudar para a sintaxe do método para linq e usar as condições if para anexar expressões à cláusula where.
fonte
Simplesmente estou usando na minha cláusula where como
fonte
Com base em certas condições, adicione a condição where ...
fonte
Aqui está meu código para fazer uma coisa semelhante. Este é um método em minha API WCF SOAP Web Service.
A consulta de base é o
Select(f => f)
que significa basicamente TUDO, e asWhere
cláusulas são opcionalmente anexadas a ela. O finalSelect
é opcional. Eu uso para converter os objetos de linhas de banco de dados em objetos de resultado "Fruta".fonte
Assumindo o seguinte parâmetro,
Basta usar
&&
e||
operadores condicionais podemos ter outra versão.Como Param1, você pode adicionar qualquer número de parâmetros para a condição de pesquisa.
fonte
Acabei de encontrar isso procurando por outra coisa, mas pensei em jogar na versão lambda.
Primeiro, eu criaria uma classe como esta para passar parâmetros para uma camada de dados:
Então, em minha camada de dados, algo assim:
Onde você materializa a consulta é com você. Pode haver uma camada entre o aplicativo e os dados que converte representações específicas do banco de dados em agnósticas do banco de dados (talvez você consulte várias fontes de dados). Essa camada pode obter vários tipos de consultáveis dessas fontes e mapeá-los para uma representação POCO comum, por exemplo.
fonte
Apenas para adicionar a resposta aceita acima aqui , se você estiver fazendo uma pesquisa dinâmica em uma junção, considere retornar um novo objeto com ambas as tabelas (t1, t2) na consulta inicial do linq para que você possa acessá-los individualmente para fazer o condicional procurar.
Eu obtive a resposta que estava procurando aqui com relação a unir duas tabelas e consultar colunas específicas em qualquer uma das tabelas
fonte