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

C# 比较Linq到Sql查询中包含多个点的两个字符串,c#,string,linq,linq-to-sql,C#,String,Linq,Linq To Sql,在我的SQL表中,有一个带有stringdatatype的version列,其中包含典型的版本值,如“1.0.0”和“2.0.2”等 我想编写一个查询,检索版本低于/高于指定版本的所有记录 例如,假设我的表如下所示: ====MY TABLE==== version column2 column3 , .... _________________________________________________ 2.0.6

在我的SQL表中,有一个带有
string
datatype的version列,其中包含典型的版本值,如“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 */
但它也抛出了同样的异常


因此,我的问题是如何在linq to sql查询中比较这些值?

首先,我们需要将
替换为空字符串,然后将其与
Float
进行比较:

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

您可以使用
Replace
Convert.ToInt32()
,它们将在Linq2Sql中进行转换,这样您就不用先加载整个表,然后再进行处理

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


var matchingResults=来自MyTable.Where中的o(w=>Convert.ToInt32(w.version.Replace('.',''))Version.Parse没有转换成SQL的功能-只需使用
Replace
函数即可。如果表有1000万行怎么办?我肯定不会加载整个表然后在应用程序中处理它们。谢谢@FarhadJabiyev,首先加载整个表,然后过滤它当然是一个选项,w我们可以很好地处理小表,但如果有一种方法可以直接提取记录,那么就是这种方法。我测试了更新的代码,但它似乎是
float.Parse()
在LinqToSql查询中引发了一个异常:
方法“Single Parse(System.String)”不支持到SQL的转换。
转换.ToInt32()
同时
Replace
工作得很好。@Sobhan谢谢,我也很高兴你标记了另一个答案。因为我不知道
float.parse
不支持。正如我说过的,我不太使用Linq to SQL。如果版本没有相同的数字,这就不起作用。例如7.5.2.66 vs 8.0.1.2-比较75266 vs 8012。
var allVersions = MyTable.ToList();
var filter = from o in allVersions
    .Where(w => Convert.ToInt32(w.version.Replace('.', '')) <= Convert.ToInt32(inputVersion.Replace('.', '')));
var filter = from o in MyTable
    .Where(w => Convert.ToInt32(w.version.Replace('.', '')) <= Convert.ToInt32(inputVersion.Replace('.', '')));