比较 Linq to Sql 查询中包含多个点的两个字符串
Comparing two strings containing multiple dots inside a Linq to Sql query
在我的 SQL table 中,我有一个带有 string
数据类型的版本列,其中包含典型的版本值,例如“1.0.0”和“2.0.2”等等.
我想编写一个查询来检索版本 lower/greater 比指定版本高的所有记录。
例如,假设我的table是这样的:
====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
列值都是字符串。所以不能正常比较。
我试过了:
from o in MyTable.Where(w=> float.Parse(w.version) <= float.Parse(inputVersion) )
/* Other codes ommited for clarity */
但显然它会抛出异常,因为 2.0.3
不是浮点数。
有一个 method 可以比较两个版本字符串,但我不能在 Linq2Sql 查询中使用它,因为它会抛出一个异常
"Method X has no supported translation to SQL."
我也试过:
from o in MyTable.Where(w=> Version.Parse(w.version) <= Version.Parse(inputVersion) )
/* Other codes ommited for clarity */
但它也抛出相同的异常。
所以我的问题是如何将 linq 中的这些值与 sql 查询进行比较?
首先,我们需要将 .
替换为空字符串,然后将其削减为 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('.', '')));
您可以使用 Replace
和 Convert.ToInt32()
,它们会在 Linq2Sql 中进行翻译,这样您就不必先加载整个 table,然后再进行处理。
此查询将直接针对数据库执行,return 仅匹配数据:
var matchingResults = from o in MyTable.Where(w=> Convert.ToInt32(w.version.Replace('.', '')) <= Convert.ToInt32(inputVersion.Replace('.', '')));
在我的 SQL table 中,我有一个带有 string
数据类型的版本列,其中包含典型的版本值,例如“1.0.0”和“2.0.2”等等.
我想编写一个查询来检索版本 lower/greater 比指定版本高的所有记录。
例如,假设我的table是这样的:
====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
列值都是字符串。所以不能正常比较。
我试过了:
from o in MyTable.Where(w=> float.Parse(w.version) <= float.Parse(inputVersion) )
/* Other codes ommited for clarity */
但显然它会抛出异常,因为 2.0.3
不是浮点数。
有一个 method 可以比较两个版本字符串,但我不能在 Linq2Sql 查询中使用它,因为它会抛出一个异常
"Method X has no supported translation to SQL."
我也试过:
from o in MyTable.Where(w=> Version.Parse(w.version) <= Version.Parse(inputVersion) )
/* Other codes ommited for clarity */
但它也抛出相同的异常。
所以我的问题是如何将 linq 中的这些值与 sql 查询进行比较?
首先,我们需要将 .
替换为空字符串,然后将其削减为 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('.', '')));
您可以使用 Replace
和 Convert.ToInt32()
,它们会在 Linq2Sql 中进行翻译,这样您就不必先加载整个 table,然后再进行处理。
此查询将直接针对数据库执行,return 仅匹配数据:
var matchingResults = from o in MyTable.Where(w=> Convert.ToInt32(w.version.Replace('.', '')) <= Convert.ToInt32(inputVersion.Replace('.', '')));