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

时间:2015-10-04 07:06:27

标签: c# string linq linq-to-sql

在我的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查询进行比较?

2 个答案:

答案 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)

您可以使用ReplaceConvert.ToInt32(),这些内容可以在Linq2Sql中进行翻译,从而节省您必须先加载整个表然后再处理。

此查询将直接针对数据库执行,并仅返回匹配的数据:

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