Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 当字段不是以字母开头时,如何查询?_Linq_Linq To Sql - Fatal编程技术网

Linq 当字段不是以字母开头时,如何查询?

Linq 当字段不是以字母开头时,如何查询?,linq,linq-to-sql,Linq,Linq To Sql,我的任务是在搜索中添加一个选项,该选项将返回给定字段不以字母开头的结果。.StartsWithletter部分并不难 但我不确定如何得到不属于A-Z集合的结果,同样希望它在下面生成一些中等效率的SQL 感谢您的帮助。好吧,我不知道这是否有效,因为我从未尝试过,也没有附近的编译器来尝试,但我要尝试的第一件事是 var query = from x in db.SomeTable where x.SomeField != null &&

我的任务是在搜索中添加一个选项,该选项将返回给定字段不以字母开头的结果。.StartsWithletter部分并不难

但我不确定如何得到不属于A-Z集合的结果,同样希望它在下面生成一些中等效率的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。

我不知道这是否可行,因为我从未尝试过它,也没有附近的编译器来尝试它,但我要尝试的第一件事是

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之间是否存在等价物。