Linq 当字段不是以字母开头时,如何查询?
我的任务是在搜索中添加一个选项,该选项将返回给定字段不以字母开头的结果。.StartsWithletter部分并不难 但我不确定如何得到不属于A-Z集合的结果,同样希望它在下面生成一些中等效率的SQLLinq 当字段不是以字母开头时,如何查询?,linq,linq-to-sql,Linq,Linq To Sql,我的任务是在搜索中添加一个选项,该选项将返回给定字段不以字母开头的结果。.StartsWithletter部分并不难 但我不确定如何得到不属于A-Z集合的结果,同样希望它在下面生成一些中等效率的SQL 感谢您的帮助。好吧,我不知道这是否有效,因为我从未尝试过,也没有附近的编译器来尝试,但我要尝试的第一件事是 var query = from x in db.SomeTable where x.SomeField != null &&
感谢您的帮助。好吧,我不知道这是否有效,因为我从未尝试过,也没有附近的编译器来尝试,但我要尝试的第一件事是
var query = from x in db.SomeTable
where x.SomeField != null &&
x.SomeField.Length >= 1 &&
x.SomeField.Substring(0, 1).All(c => !Char.IsLetter(c))
select x;
LINQ to SQL可能无法将其转换为SQL。我不知道这是否可行,因为我从未尝试过它,也没有附近的编译器来尝试它,但我要尝试的第一件事是
var query = from x in db.SomeTable
where x.SomeField != null &&
x.SomeField.Length >= 1 &&
x.SomeField.Substring(0, 1).All(c => !Char.IsLetter(c))
select x;
LINQ to SQL可能无法将其转换为SQL。尽管SQL提供了使用括号符号[a-f]%检查LIKE语句中字符范围的能力,例如,我还没有看到LINQ to SQL构造直接支持这一点 有几点想法: 首先,如果结果集相对较小,则可以在事件发生后在内存中进行.ToList和筛选 或者,如果您能够更改数据模型,则可以设置其他字段或表来帮助索引数据和改进搜索 -编辑-
根据Ruslan下面的评论进行了更改。尽管SQL提供了使用括号符号[a-f]%检查LIKE语句中字符范围的功能,例如,我还没有看到linq to SQL构造直接支持这一点 有几点想法: 首先,如果结果集相对较小,则可以在事件发生后在内存中进行.ToList和筛选 或者,如果您能够更改数据模型,则可以设置其他字段或表来帮助索引数据和改进搜索 -编辑-
根据Ruslan下面的评论进行了更改。在C中使用以下构造,假设db是数据上下文:
var query = from row in db.SomeTable
where !System.Data.Linq.SqlClient.SqlMethods.Like(row.SomeField, "[A-Z]%")
select row;
这仅在LINQ到SQL查询中受支持。T-SQL类运算符的所有规则都适用
您也可以使用效率较低的解决方案:
var query = from row in db.SomeTable
where row.SomeField[0] < 'A' || row.SomeField[0] > 'Z'
select row;
这将转换为子字符串、强制转换和UNICODE构造
最后,您可以使用VB,在VB中似乎有对类似方法的本机支持。在C中,假设db是数据上下文,则使用以下构造:
var query = from row in db.SomeTable
where !System.Data.Linq.SqlClient.SqlMethods.Like(row.SomeField, "[A-Z]%")
select row;
这仅在LINQ到SQL查询中受支持。T-SQL类运算符的所有规则都适用
您也可以使用效率较低的解决方案:
var query = from row in db.SomeTable
where row.SomeField[0] < 'A' || row.SomeField[0] > 'Z'
select row;
这将转换为子字符串、强制转换和UNICODE构造
最后,你可以用VB,其中似乎存在对Like方法的本机支持。您将得到一个异常:System.NotSupportedException:类型'System.String'不支持序列运算符。您将得到一个异常:System.NotSupportedException:类型'System.String'不支持序列运算符。SQL支持类似的范围模式,即'a-z'%'并且Linq to SQL有一个System.Data.Linq.SqlClient.SqlMethods.Like方法,它是SQL的passthru,而不是执行转换和转义的.StartsWidth、.Substring等。我不知道这件事。谢谢尽管如此,仍然不确定linq到sql是否有任何等价物。sql支持带范围模式的LIKE,即LIKE“[a-z]”,并且linq到sql有一个System.Data.linq.SqlClient.SqlMethods.LIKE方法,它是sql的一个passthru,与.StartsWidth、.Substring等不同,可以进行转换和转义。哇。我不知道这件事。谢谢但仍然不确定linq和sql之间是否存在等价物。