开发者

LINQ to SQL query to determine if value starts with numeric

I have a project where I query users by first letter:

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

..where repository.GetAll() returns an IQueryable<Bruker>, BrukerIdent is a string that contains the username, and letter is a char-value coming in. This works perfectly, except that I also want to get users that starts with digits. And I don't want to sort by separate digits.

My mind yells for a StartsWith("\d") but as far as I have found out it doesn't work this way. I have also thought of doing a 10-way OR clause, b开发者_运维知识库ut that would look like spaghetti, and I'm not sure of the efficiency.

Is there any "right" way to do it like this?


If this is for LINQ-to-SQL you could use SqlMethods.Like method here:

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


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;


I suspect @abatishchev's revised answer will help here, but if you are doing this lots, or this is an important query, then I strongly suggest a refactor. For example:

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)

I can now do a very efficient first-character match simply by testing firstChar. Which could be an integer instead if the numeric ones are particularly important.


Perhaps not so readable, but the following would probably work:

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

Maybe there are some exotic collation sequences where this would fail, but I expect it would work in most situations.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜