Eu tenho uma grande pergunta.
Recebi uma consulta linq para colocar simplesmente assim:
from xx in table
where xx.uid.ToString().Contains(string[])
select xx
Os valores da string[]
matriz seriam números como (1,45,20,10, etc ...)
o padrão para .Contains
é .Contains(string)
.
Eu preciso fazer isso ao invés: .Contains(string[])
...
EDIT: Um usuário sugeriu escrever uma classe de extensão para string[]
. Eu gostaria de aprender como, mas alguém está disposto a me apontar na direção certa?
EDIT: O uid também seria um número. É por isso que é convertido em string.
Ajuda alguém?
Respostas:
spoulson está quase certo, mas você precisa criar um
List<string>
desde ostring[]
início. Na verdade,List<int>
seria melhor se uid também fosseint
.List<T>
apoiaContains()
. Fazeruid.ToString().Contains(string[])
isso implicaria que o uid como uma string contém todos os valores da matriz como uma substring ??? Mesmo que você tenha escrito o método de extensão, o sentido dele estaria errado.[EDITAR]
A menos que você o tenha mudado e escrito
string[]
como Mitch Wheat demonstra, você poderá simplesmente pular a etapa de conversão.[FINALIZAR]
Aqui está o que você deseja, se você não fizer o método de extensão (a menos que você já tenha a coleção de uids potenciais como ints - então apenas use em seu
List<int>()
lugar). Isso usa a sintaxe do método encadeado, que eu acho mais limpa, e faz a conversão para int para garantir que a consulta possa ser usada com mais provedores.fonte
List<int>
vez disso e pularia aToString
chamada.Se você realmente deseja replicar Contains , mas para uma matriz, aqui está um método de extensão e um código de amostra para uso:
fonte
!string.IsNullOrEmpty(str)
verificação for aprovada, fazendo com que avalues.Length > 0
condição seja ignorada, mas o comprimento de Values for 0 , ele irá para oforeach
e será interrompido imediatamente porque não há entradas na matriz, indo diretamente para oreturn false
.Experimente o seguinte.
fonte
LINQ no .NET 4.0 tem outra opção para você; o método. Qualquer ();
fonte
Any()
eAll()
métodos são tão simples :) Eu posso usart => words.All(w => t.Title.Contains(w))
.Ou se você já tem os dados em uma lista e prefere o outro formato Linq :)
fonte
E se:
fonte
Este é um exemplo de uma maneira de escrever um método de extensão (nota: eu não usaria isso para matrizes muito grandes; outra estrutura de dados seria mais apropriada ...):
fonte
Esta é uma resposta tardia, mas acredito que ainda seja útil .
Eu criei o pacote nuget NinjaNye.SearchExtension que pode ajudar a resolver esse problema:
Você também pode pesquisar várias propriedades de string
Ou execute um
RankedSearch
que retornaIQueryable<IRanked<T>>
que simplesmente inclui uma propriedade que mostra quantas vezes os termos de pesquisa apareceram:Há um guia mais extenso na página de projetos do GitHub: https://github.com/ninjanye/SearchExtensions
Espero que isso ajude futuros visitantes
fonte
IQueryable
eIEnumerable
- lembre-se de que se você encadeá-lo de um IEnumerable, ele será executado na memória em vez de construir uma consulta e enviá-la para a fonteMétodo de extensão Linq. Funcionará com qualquer objeto IEnumerable:
Uso:
fonte
Eu acredito que você também pode fazer algo assim.
fonte
Portanto, estou assumindo corretamente que uid é um Identificador Único (Guid)? Este é apenas um exemplo de um cenário possível ou você está realmente tentando encontrar um guid que corresponda a um array de strings?
Se isso for verdade, você pode querer realmente repensar toda a abordagem, parece uma péssima ideia. Você provavelmente deve tentar combinar um Guid com um Guid
Sinceramente, não consigo imaginar um cenário em que corresponder uma matriz de string usando "contém" ao conteúdo de um Guid seria uma boa ideia. Por um lado, Contains () não garante a ordem dos números no Guid, portanto, você pode potencialmente corresponder a vários itens. Sem mencionar que comparar guias dessa forma seria muito mais lento do que apenas fazer diretamente.
fonte
Você deve escrever ao contrário, verificando se sua lista de IDs de usuário privilegiado contém o ID nessa linha da tabela:
LINQ se comporta bem aqui e o converte em uma boa instrução SQL:
que basicamente incorpora o conteúdo do array 'search' na consulta sql e faz a filtragem com a palavra-chave 'IN' no SQL.
fonte
Consegui encontrar uma solução, mas não muito boa, pois requer o uso de AsEnumerable () que vai retornar todos os resultados do banco de dados, felizmente só tenho 1k registros na tabela, então não é realmente perceptível, mas aqui vai .
Minha postagem original é a seguinte:
fonte
A melhor solução que encontrei foi ir em frente e criar uma função com valor de tabela em SQL que produza os resultados, como:
Em seguida, você simplesmente arrasta a função para o designer LINQ.dbml e a chama como faz com seus outros objetos. O LINQ conhece até as colunas de sua função armazenada. Eu chamo assim:
Incrivelmente simples e realmente utiliza o poder do SQL e do LINQ no aplicativo ... e você pode, é claro, gerar qualquer função com valor de tabela que desejar para os mesmos efeitos!
fonte
Eu acredito que o que você realmente deseja fazer é: vamos imaginar um cenário em que você tem dois bancos de dados e eles têm uma tabela de produtos em comum E você deseja selecionar produtos da tabela "A" que o id tem em comum com o "B"
usar o método contém seria muito complicado para fazer isso, o que estamos fazendo é uma interseção, e há um método chamado interseção para isso
um exemplo do msdn: http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#intersect1
números int [] = (0, 2, 4, 5, 6, 8, 9); int [] números B = (1, 3, 5, 7, 8); var = commonNumbers numbersA.Intersect (numbersB);
Acho que o que você precisa é facilmente resolvido com interseção
fonte
Verifique este método de extensão:
fonte
fonte
Experimentar:
fonte
fonte
fonte
fonte