Tengo una gran pregunta.
Tengo una consulta de linq para ponerlo simplemente se ve así:
from xx in table
where xx.uid.ToString().Contains(string[])
select xx
Los valores de la string[]
matriz serían números como (1,45,20,10, etc ...)
el valor predeterminado para .Contains
es .Contains(string)
.
Lo necesito para hacer esto en su lugar: .Contains(string[])
...
EDITAR: Un usuario sugirió escribir una clase de extensión para string[]
. Me gustaría aprender cómo, pero ¿alguien está dispuesto a señalarme en la dirección correcta?
EDITAR: El uid también sería un número. Por eso se convierte en una cadena.
Ayudar a alguien?
Respuestas:
spoulson lo tiene casi bien, pero necesitas crear un
List<string>
desde elstring[]
principio. En realidadList<int>
, sería mejor si uid tambiénint
.List<T>
apoyosContains()
. Hacerlouid.ToString().Contains(string[])
implicaría que el uid como una cadena contiene todos los valores de la matriz como una subcadena ??? Incluso si escribiera el método de extensión, el sentido sería incorrecto.[EDITAR]
A menos que lo cambie y lo escriba
string[]
como lo demuestra Mitch Wheat, entonces podrá omitir el paso de conversión.[ENDEDIT]
Esto es lo que desea, si no usa el método de extensión (a menos que ya tenga la colección de posibles uids como ints, entonces use
List<int>()
en su lugar). Esto usa la sintaxis del método encadenado, que creo que es más limpia, y realiza la conversión a int para garantizar que la consulta se pueda usar con más proveedores.fuente
List<int>
lugar y omitiría laToString
llamada.Si realmente está buscando replicar Contains , pero para una matriz, aquí hay un método de extensión y un código de muestra para su uso:
fuente
!string.IsNullOrEmpty(str)
verificación pasa, lovalues.Length > 0
que hace que se ignore la condición, pero la longitud de los valores era 0 , entonces iría alforeach
y luego se rompería inmediatamente porque no hay entradas en el arreglo, yendo directamente alreturn false
.Intente lo siguiente.
fuente
LINQ en .NET 4.0 tiene otra opción para ti; el método .Any ();
fuente
Any()
y losAll()
métodos son tan simples :) Puedo usart => words.All(w => t.Title.Contains(w))
.O si ya tiene los datos en una lista y prefiere el otro formato Linq :)
fuente
Qué tal si:
fuente
Este es un ejemplo de una forma de escribir un método de extensión (nota: no usaría esto para matrices muy grandes; otra estructura de datos sería más apropiada ...):
fuente
Esta es una respuesta tardía, pero creo que sigue siendo útil .
He creado el paquete nuget NinjaNye.SearchExtension que puede ayudar a resolver este mismo problema:
También puede buscar varias propiedades de cadena
O realice un
RankedSearch
which devuelveIQueryable<IRanked<T>>
que simplemente incluye una propiedad que muestra cuántas veces aparecieron los términos de búsqueda:Hay una guía más extensa en la página de proyectos de GitHub: https://github.com/ninjanye/SearchExtensions
Espero que esto ayude a los futuros visitantes
fuente
IQueryable
yIEnumerable
, solo tenga cuidado, ya que si lo encadena un IEnumerable, se ejecutará en memoria en lugar de crear una consulta y enviarla a la fuenteMétodo de extensión Linq. Funcionará con cualquier objeto IEnumerable:
Uso:
fuente
Creo que también podrías hacer algo como esto.
fuente
Entonces, ¿estoy asumiendo correctamente que uid es un identificador único (Guid)? ¿Es esto solo un ejemplo de un escenario posible o realmente está tratando de encontrar una guía que coincida con una matriz de cadenas?
Si esto es cierto, es posible que desee reconsiderar todo este enfoque, parece una muy mala idea. Probablemente debería intentar hacer coincidir un Guid con un Guid
Honestamente, no puedo imaginar un escenario en el que hacer coincidir una matriz de cadenas utilizando "contiene" con el contenido de un Guid sería una buena idea. Por un lado, Contains () no garantizará el orden de los números en el Guid, por lo que podría hacer coincidir varios elementos. Sin mencionar que comparar las guías de esta manera sería mucho más lento que hacerlo directamente.
fuente
Debe escribirlo al revés, verificando que su lista de identificación de usuario privilegiado contenga la identificación en esa fila de la tabla:
LINQ se comporta bastante brillante aquí y lo convierte en una buena declaración SQL:
que básicamente incrusta el contenido de la matriz 'buscar' en la consulta sql, y realiza el filtrado con la palabra clave 'IN' en SQL.
fuente
Me las arreglé para encontrar una solución, pero no excelente, ya que requiere el uso de AsEnumerable () que devolverá todos los resultados de la base de datos, afortunadamente solo tengo 1k registros en la tabla, por lo que no es realmente notable, pero aquí va .
Mi publicación original es la siguiente:
fuente
La mejor solución que encontré fue seguir adelante y crear una función con valores de tabla en SQL que produzca los resultados, como:
Luego, simplemente arrastre la función a su diseñador LINQ.dbml y llámelo como lo hace con sus otros objetos. El LINQ incluso conoce las columnas de su función almacenada. Lo llamo así:
Increíblemente simple y realmente utiliza el poder de SQL y LINQ en la aplicación ... y, por supuesto, puede generar cualquier función con valor de tabla que desee para los mismos efectos.
fuente
Creo que lo que realmente quieres hacer es: imaginemos un escenario en el que tienes dos bases de datos y tienen una tabla de productos en común y quieres seleccionar productos de la tabla "A" que id tiene en común con la "B".
usar el método contiene sería demasiado complicado para hacer esto, lo que estamos haciendo es una intersección, y hay un método llamado intersección para eso
un ejemplo de msdn: http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#intersect1
int [] números = (0, 2, 4, 5, 6, 8, 9); int [] númerosB = (1, 3, 5, 7, 8); var = commonNumbers numbersA.Intersect (numbersB);
Creo que lo que necesitas se resuelve fácilmente con intersección.
fuente
Compruebe este método de extensión:
fuente
fuente
Tratar:
fuente
fuente
fuente
fuente