我有一个项目,我用第一个字母查询用户:
repository.GetAll().Where(q => q.BrukerIdent.StartsWith(letter.ToString())).ToList();
.. repository.GetAll()
返回IQueryable<Bruker>
,BrukerIdent
是一个包含用户名的字符串,而letter
是一个char值。这很有效,除了我还希望得到以数字开头的用户。而且我不想按单独的数字排序。
我的大脑为StartsWith("\d")
大喊大叫,但据我所知,它不会这样。我还想过做一个10路OR条款,但这看起来像意大利面条,而且我不确定效率。
有没有“正确”的方式这样做?
答案 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]))
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 < ":"
也许有一些奇怪的校对序列可能会失败,但我希望它能在大多数情况下起作用。