Linq to sql T-SQL选择匹配的值是数值,并且也在指定范围内。(加上Linq到sql)

Linq to sql T-SQL选择匹配的值是数值,并且也在指定范围内。(加上Linq到sql),linq-to-sql,tsql,predicatebuilder,Linq To Sql,Tsql,Predicatebuilder,我试图从一个表中选择行,其中一个(NVARCHAR)列在数值范围内 SELECT ID, Value FROM Data WHERE ISNUMERIC(Value) = 1 AND CONVERT(FLOAT, Value) < 66.6 因此,显而易见的解决方案是将整个select语句包装在另一个select and WHERE中,并从外部select的WHERE中的内部select和过滤器返回转换后的值。不幸的是,这就是我的Linq到sql问题的症结所在。我不仅按一个范围过滤,还可

我试图从一个表中选择行,其中一个(NVARCHAR)列在数值范围内

SELECT ID, Value
FROM Data
WHERE ISNUMERIC(Value) = 1 AND CONVERT(FLOAT, Value) < 66.6
因此,显而易见的解决方案是将整个select语句包装在另一个select and WHERE中,并从外部select的WHERE中的内部select和过滤器返回转换后的值。不幸的是,这就是我的Linq到sql问题的症结所在。我不仅按一个范围过滤,还可能按多个范围过滤,或者只按记录的存在进行过滤(我遗漏了一些日期范围的选择和比较)

基本上,我希望能够生成如下内容:

SELECT ID, TypeID, Value
FROM Data
WHERE (TypeID = 4 AND ISNUMERIC(Value) AND CONVERT(Float, Value) < 66.6) 
      OR (TypeID = 8 AND ISNUMERIC(Value) AND CONVERT(Float, Value) > 99)
      OR (TypeID = 9)
选择ID、TypeID、Value
从数据
其中(TypeID=4,ISNUMERIC(值)和CONVERT(Float,Value)<66.6)
或者(TypeID=8,ISNUMERIC(值)和CONVERT(Float,Value)>99)
或(类型ID=9)
(每个where选项中都有一些其他子句。)如果我过滤掉内部select中的非ISNUMERIC值,这显然不起作用

正如我提到的,我正在使用LINQtoSQL(和PredicateBulider)构建这些查询,但不幸的是

Datas.Where(x => ISNUMERIC(x.Value) ? Convert.ToDouble(x.Value) < 66.6 : false)
Datas.Where(x=>ISNUMERIC(x.Value)?Convert.ToDouble(x.Value)<66.6:false)
转换为此,但无法解决初始问题

WHERE (ISNUMERIC([t0].[Value]) = 1) AND ((CONVERT(Float,[t0].[Value])) < @p0)
其中(ISNUMERIC([t0].[Value])=1)和((CONVERT(Float[t0].[Value]))<@p0)

我最后的办法是在同一个表上对每一个比较进行外部连接,以进行双重选择,但这并不是一个理想的解决方案。我想知道以前是否有人遇到过类似的问题

我认为问题不在于和本身,而在于从NVARCHAR到FLOAT的转换

请看下面的示例

DECLARE @Table TABLE(
        Value NVARCHAR(10)
)

INSERT INTO @Table SELECT '1'
INSERT INTO @Table SELECT '100'
INSERT INTO @Table SELECT 'A'

SELECT  *
FROM    @Table
WHERE   ISNUMERIC(Value)= 1 AND CAST(CAST(Value AS VARCHAR(10)) AS FLOAT) > 50

SELECT  *
FROM    @Table
WHERE   ISNUMERIC(Value)= 1 AND CAST(Value AS FLOAT) > 50
最后一个选择是我得到错误声明的地方

Msg 8114,16级,状态5,第13行 将数据类型nvarchar转换为时出错 浮动


但是第一个选择很好。

太棒了,非常感谢。但这为什么会引起问题呢?@AdriaanStander我也被这个问题弄疯了。你救了我(七年后!)。我不明白为什么需要在将已经存在的NVARCHAR转换为FLOAT之前将其重新转换为NVARCHAR(在我的例子中,问题是VARCHAR并转换为INT,但这完全是同一个问题)。
Datas.Where(x => ISNUMERIC(x.Value) ? Convert.ToDouble(x.Value) < 66.6 : false)
WHERE (ISNUMERIC([t0].[Value]) = 1) AND ((CONVERT(Float,[t0].[Value])) < @p0)
DECLARE @Table TABLE(
        Value NVARCHAR(10)
)

INSERT INTO @Table SELECT '1'
INSERT INTO @Table SELECT '100'
INSERT INTO @Table SELECT 'A'

SELECT  *
FROM    @Table
WHERE   ISNUMERIC(Value)= 1 AND CAST(CAST(Value AS VARCHAR(10)) AS FLOAT) > 50

SELECT  *
FROM    @Table
WHERE   ISNUMERIC(Value)= 1 AND CAST(Value AS FLOAT) > 50