LINQ to SQL查询以确定值是否以数字开头

我有一个项目,我通过第一个字母查询用户:

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

..where repository.GetAll()返回一个IQueryableBrukerIdent是一个包含用户名的字符串,而letter是一个char值。这很有效,除了我还希望得到以数字开头的用户。 而且我不想按单独的数字排序。

我的头脑为StartsWith("\d")大喊大叫,但据我发现,它不会以这种方式工作。 我还想过做一个10路OR条款,但这看起来像意大利面条,我不确定效率。

有没有“正确”的方式这样做?

 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; 

如果这是针对LINQ-to-SQL的,可以在这里使用SqlMethods.Like方法:

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

怀疑 @ abatishchev的修改后的答案在这里会有所帮助,但如果你这么做,或者这是一个重要的查询,那么我强烈建议一个重构。 例如:

 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) 

我现在可以通过测试firstChar来进行非常有效的第一个字符匹配。 如果数字值特别重要,则可以是整数。

也许不那么可读,但以下可能会起作用:

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

也许有一些奇怪的校对序列可能会失败,但我希望它能在大多数情况下起作用。