2009-05-27 15 views
5

Estoy usando SQLite desde un programa C# usando SQLite.net (http://sqlite.phxsoftware.com).insensible a mayúsculas/minúsculas ordenadas por SQLite en .net

Por defecto SQLite select order by clause sort es sensible a las mayúsculas y minúsculas, deseo que el resultado sea insensible a mayúsculas y minúsculas, encontré "COLLATE NOCASE" pero la documentación dice que solo manejará caracteres ingleses en el rango de ASCII, quiero verdadera lingüística clasificación internacional insensible a mayúsculas y minúsculas utilizando la intercalación CultureInfo.CurrentCulture (hacer que use String.Compere hará el truco).

Gracias

Respuesta

3

creo que de confrontación no se proporciona en las versiones actuales de SQLite. Como tal, parece que el plan más sensato es eliminar el género de la consulta y, en su lugar, ordenarlo en .Net puro, donde tienes control total y acceso a construcciones como la información cultural de la secuencia.

Dado que ambos están sucediendo en el mismo proceso, esto no debería marcar una gran diferencia en términos de rendimiento a menos que el conjunto de datos sea muy grande.

SQLite 3 permite las funciones de intercalación definidas por el usuario, y esto se puede hacer en SQLite.Net como funciones .NET, pero la sobrecarga de llamadas hacia adelante y hacia atrás a través del límite gestionado/no gestionado es considerable. Aquí hay uno persons attempts to do it in c++. A menos que tenga acceso a la clasificación sensible a la cultura unicode bien probada y estable de otra persona en C++, le sugiero que se apegue al tipo simple después de la aproximación siempre que sea posible.

Por supuesto, si el rendimiento de la intercalación definida por el usuario es más que suficiente para sus necesidades actuales, entonces vaya con eso.

[SQLiteFunction(Name = "CULTURESORT", FuncType = FunctionType.Collation)] 
class CultureSort : SQLiteFunction 
{ 
    public override int Compare(string param1, string param2) 
    { 
     return String.Compare(
      param1,param2, CultureInfo.CurrentCulture, CompareOptions.IgnoreCase) 
     ); 
    } 
} 

Posdata si te apetece lujo: Hay una acumulación bendito de SQLite, que integrates the ICU library de apoyo 'adecuado' Unicode al efectuar el pedido/como/superior/inferior, sino que tendría que integrar esto en el código SQLite utilizado como respaldo para el contenedor .Net. Esto no es fácil.

0

Sí, esto es mucho más complejo de lo que supondría. En algunas culturas las reglas son diferentes y sin saber de qué cultura quiere basarse se vuelve imposible. Considere el ejemplo famoso (entre personas i18n) de Turkish.

1

SQLite.NET le permite definir funciones personalizadas en C# que puede usar en consultas SQL. Por lo tanto, debería ser posible escribir una función o custom_upper custom_lower en C# que se ocuparía de la conversión ocurre con la intercalación actual cultura ...

-1

Puede utilizar el método ToLower() para obtener resultados rápidos:

return model.Users.OrderBy(u => u.Name.ToLower()).ToList(); 
+0

toooo lenta) convertir cadena entera sólo para usar primer par de caracteres –

+0

Quizás quiso probarlo? La conversión ocurre en el lado de SQL. – Rover

+0

Sí. No creo que MSIL se interprete de manera diferente en ninguno de los lados. –

0

usted puede simplemente utilizar la función lower() sqlite:

select * from data order by lower(name) 
+0

No no no, no funciona, pero en teoría es correcto –

+0

de la manera correcta sería seleccionar * del orden de datos por debajo (nombre), nombre –

+0

¿No veo por qué no funcionaría? – njzk2

Cuestiones relacionadas