C# 比较Linq到Sql查询中包含多个点的两个字符串
在我的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
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('.', '')));