LINQ alla query SQL per determinare se il valore inizia con valori numerici

Ho un progetto in cui interrogare gli utenti con la prima lettera:

repository.GetAll().Where(q => q.BrukerIdent.StartsWith(letter.ToString())).ToList(); 

… dove repository.GetAll() restituisce un IQueryable , BrukerIdent è una stringa che contiene il nome utente, e letter è un valore char in entrata. Funziona perfettamente, tranne che voglio anche ottenere utenti che iniziano con cifre . E non voglio ordinare per cifre separate.

La mia mente urla per un StartsWith("\d") ma, per quanto ho scoperto, non funziona in questo modo. Ho anche pensato di fare una clausola OR a 10 vie, ma sembrerebbe uno spaghetti e non sono sicuro dell’efficienza.

Esiste un modo “giusto” per farlo in questo modo?

 repository.GetAll().Where(q => Char.IsNumber(q.BrukerIdent[0])) 

MSDN


 var numbers = Enumerable .Range(0, 10) .Select(i => i.ToString(CultureInfo.InvariantCulture)); // var numbers = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ); // var numbers = HashSet { ... }; var q = from b in repository.GetAll() where numbers.Contains(b.BrukerIdent.FirstOrDefault())) //[0] select b; 

Se questo è per LINQ-to-SQL puoi usare il metodo SqlMethods.Like qui:

 var result = repository .GetAll() .Where(q => SqlMethods.Like(q.BrukerIdent, "[0-9]%")) .ToList(); 

Ho il sospetto che la risposta revisionata di @ abatishchev possa essere d’aiuto, ma se stai facendo questi lotti, o questa è una domanda importante, allora consiglio vivamente un refactoring. Per esempio:

 create table Test ( id int not null identity(1,1) primary key clustered, name nvarchar(20) not null, firstChar as (case when LEN(name) = 0 then null else SUBSTRING(name,1,1) end) persisted ) go create nonclustered index Test_firstChar on Test (firstChar) 

Ora posso fare una corrispondenza del primo carattere molto efficiente semplicemente testando firstChar . Quale potrebbe essere un numero intero se invece quelli numerici sono particolarmente importanti.

Forse non è così leggibile, ma probabilmente ciò che segue potrebbe funzionare:

 q.BrukerIdent >= "0" && q.BrukerIdent < ":" 

Forse ci sono alcune sequenze di collazione esotiche in cui ciò fallirebbe, ma mi aspetto che funzioni nella maggior parte delle situazioni.