比较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查询?

比较Linq to Sql查询中包含多个点的两个字符串

您可以使用ReplaceConvert.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('.', '')));