LINQ to SQL запрос, чтобы определить, начинается ли значение с цифры - PullRequest
4 голосов
/ 18 апреля 2011

У меня есть проект, в котором я запрашиваю пользователей по первой букве:

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

.., где repository.GetAll() возвращает IQueryable<Bruker>, BrukerIdent - строка, содержащая имя пользователя, и letter это входящее значение char. Это отлично работает, за исключением того, что я также хочу получить пользователей, которые начинаются с цифр.И я не хочу сортировать по разным цифрам.

Мой разум кричит о StartsWith("\d"), но, насколько я понял, это не работает таким образом.Я также подумал о том, чтобы сделать предложение с 10 путями, но это выглядело бы как спагетти, и я не уверен в эффективности.

Есть ли "правильный" способ сделать это так?

Ответы [ 4 ]

13 голосов
/ 18 апреля 2011

Если это для LINQ-to-SQL, вы можете использовать метод SqlMethods.Like здесь:

var result = repository
    .GetAll()
    .Where(q => SqlMethods.Like(q.BrukerIdent, "[0-9]%"))
    .ToList();
7 голосов
/ 18 апреля 2011
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 голосов
/ 18 апреля 2011

I подозреваю, что пересмотренный ответ @ 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.Вместо этого это может быть целое число, если особенно важны числовые.

1 голос
/ 18 апреля 2011

Возможно, не так читабельно, но, вероятно, сработает следующее:

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

Может быть, есть некоторые экзотические последовательности сортировки, где это не получится, но я ожидаю, что это сработает в большинстве ситуаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...