在我的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
列值都是字符串。所以他们无法正常比较。
我试过了:
from o in MyTable.Where(w=> float.Parse(w.version) <= float.Parse(inputVersion) )
/* Other codes ommited for clarity */
但显然它会引发异常,因为2.0.3
不是浮点数。
有一个method可以比较两个版本字符串,但我不能在Linq2Sql查询中使用它,因为它会抛出异常说
“方法X没有支持的SQL转换。”
我也试过了:
from o in MyTable.Where(w=> Version.Parse(w.version) <= Version.Parse(inputVersion) )
/* Other codes ommited for clarity */
但它也会引发同样的异常。
所以我的问题是如何将linq中的这些值与sql查询进行比较?
答案 0 :(得分:1)
首先,我们需要将.
替换为空字符串,然后将其削减到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('.', '')));
答案 1 :(得分:1)
您可以使用Replace
和Convert.ToInt32()
,这些内容可以在Linq2Sql中进行翻译,从而节省您必须先加载整个表然后再处理。
此查询将直接针对数据库执行,并仅返回匹配的数据:
var matchingResults = from o in MyTable.Where(w=> Convert.ToInt32(w.version.Replace('.', '')) <= Convert.ToInt32(inputVersion.Replace('.', '')));