比较 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('.', '')));

您可以使用 ReplaceConvert.ToInt32(),它们会在 Linq2Sql 中进行翻译,这样您就不必先加载整个 table,然后再进行处理。

此查询将直接针对数据库执行,return 仅匹配数据:

var matchingResults = from o in MyTable.Where(w=> Convert.ToInt32(w.version.Replace('.', '')) <= Convert.ToInt32(inputVersion.Replace('.', '')));