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

时间:2011-04-18 11:29:35

标签: c# .net linq-to-sql

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

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

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

我的大脑为StartsWith("\d")大喊大叫,但据我所知,它不会这样。我还想过做一个10路OR条款,但这看起来像意大利面条,而且我不确定效率。

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

4 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:7)

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<int> { ... };

var q = from b in repository.GetAll()
        where numbers.Contains(b.BrukerIdent.FirstOrDefault())) //[0]
        select b;

答案 2 :(得分:2)

怀疑 @ 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来进行非常有效的第一个字符匹配。如果数字值特别重要,则可以是整数。

答案 3 :(得分:1)

也许不那么可读,但以下内容可能有效:

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

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