比较Linq to Sql查询中包含多个点的两个字符串
本文关键字:字符串 两个 比较 Sql to 查询 包含多 Linq | 更新日期: 2023-09-27 18:15:49
在我的SQL表中,我有一个string
数据类型的版本列,其中包含典型的版本值,如'1.0.0'和'2.0.2'等。
我想写一个查询,检索所有版本小于/大于指定版本的记录。
例如,假设我的表是这样的:
====MY TABLE====
version column2 column3 , ....
_________________________________________________
2.0.6 ... ... ...
2.0.5 ... ... ...
2.0.4 ... ... ...
2.0.3 ... ... ...
现在我想检索version
低于等于2.0.5的所有记录
我的主要问题是输入(在本例中为2.0.5)和version
列值都是字符串。所以它们不能正常比较。
I've try:
from o in MyTable.Where(w=> float.Parse(w.version) <= float.Parse(inputVersion) )
/* Other codes ommited for clarity */
但是显然它抛出了一个异常,因为2.0.3
不是浮点数。
有一个比较两个版本字符串的方法,但我不能在Linq2Sql查询中使用它,因为它会抛出一个异常,说
"方法X不支持转换为SQL。"
Also i've try:
from o in MyTable.Where(w=> Version.Parse(w.version) <= Version.Parse(inputVersion) )
/* Other codes ommited for clarity */
但是它也会抛出同样的异常
所以我的问题是我怎么能比较这些值在linq sql查询?
您可以使用Replace
和Convert.ToInt32()
,这些在Linq2Sql中得到翻译,这节省了您必须先加载整个表,然后再处理。
这个查询将直接对数据库执行,并且只返回匹配的数据:
var matchingResults = from o in MyTable.Where(w=> Convert.ToInt32(w.version.Replace('.', '')) <= Convert.ToInt32(inputVersion.Replace('.', '')));
首先,我们需要将.
替换为Empty string,然后将其裁剪为Float
:
var allVersions = MyTable.ToList();
var filter = from o in allVersions
.Where(w => Convert.ToInt32(w.version.Replace('.', '')) <= Convert.ToInt32(inputVersion.Replace('.', '')));
(我一直使用Entity Framework
,只有在Canonical Functions
的帮助下才能在EF上工作。)所以我告诉你要获取所有数据然后在应用程序内存中过滤。但是在Linq to SQL中直接检查这个查询是值得的,因为在Google上进行了一些调查之后,似乎在Linq to SQL中支持转换数据类型和替换操作。
更新:
我没有使用LinqToSQL,但这段代码也可以在数据库中运行,所以不要忘记检查,也没有检索所有数据:
var filter = from o in MyTable
.Where(w => Convert.ToInt32(w.version.Replace('.', '')) <= Convert.ToInt32(inputVersion.Replace('.', '')));