2015-10-04 82 views
2

在我的SQL表中,我有一个string数据类型的版本列,其中包含典型的版本值,如'1.0.0'和'2.0.2'等等。在Linq to Sql查询中比较两个包含多个点的字符串

我想编写一个查询,检索版本低于/大于指定版本的所有记录。

例如,假设我的表是这样的:

    ====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

Version.Parse没有翻译成SQL - 简单地使用'Replace'功能来做到这一点。 – CSL

回答

1

您可以使用ReplaceConvert.ToInt32(),这些将在Linq2Sql中进行翻译,这样可以节省您不必先装载整个表格,然后再进行处理。

这个查询将在数据库中直接执行并返回只匹配数据:

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

+0

如果版本没有相同的编号,则这不起作用。防爆。 7.5.2.66 vs 8.0.1.2 - 比较75266 vs 8012。 – Kipotlov

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和这样的东西的作品在EF只与一些Canonical Functions帮助。所以我告诉你要获得所有的数据,然后过滤到应用程序内存中,但是直接在Linq to SQL中检查这个查询是值得的,因为经过对谷歌的一些调查,Linq支持转换数据类型和替换操作到Sql)。

更新:

我没有用LinqToSQL,但是这个代码也可以在数据库中运行,所以不要忘记检查也没有检索所有提交的数据:

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

如果桌子有1000万行呢?我绝对不会加载整个表格,然后在应用程序中处理它们。 – CSL

+1

谢谢@FarhadJabiyev,首先加载整个表格然后过滤它是一个选项,并且对于小表格可以很好地工作,但是如果有一种方法可以直接提取记录,那么它就是这样。我测试了你的更新后的代码,但是在LinqToSql查询里面看起来像'float.Parse()'抛出一个异常:'Method'Single Parse(System.String)'没有支持到SQL的转换。'Convert.ToInt32()'沿着方'替换'运作良好。 – Sobhan

+1

@Sobhan谢谢,我也很高兴你标记了其他答案。因为我不知道'float.parse'不支持。正如我告诉我,我不使用Linq到SQL很多。 –