小编Tob*_*oby的帖子

T-SQL选择与ISNUMERIC匹配的值,并且也在指定范围内.(加上Linq-to-sql)

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

SELECT ID, Value
FROM Data
WHERE ISNUMERIC(Value) = 1 AND CONVERT(FLOAT, Value) < 66.6
Run Code Online (Sandbox Code Playgroud)

不幸的是,作为SQL规范的一部分,AND子句不必短路(并且不在MSSQL Server EE 2008上).更多信息:SQL WHERE子句的短路评估是什么?

我的下一次尝试是尝试这个,看看我是否可以延迟评估CONVERT

SELECT ID, Value
FROM Data
WHERE (CASE WHEN ISNUMERIC(Value) = 1 THEN CONVERT(FLOAT, Value) < 66.6 ELSE 0 END)
Run Code Online (Sandbox Code Playgroud)

但我似乎无法使用CONVERT的结果<(或任何比较).它因错误而失败

Incorrect syntax near '<'.
Run Code Online (Sandbox Code Playgroud)

我可以逃脱

SELECT ID, CONVERT(FLOAT, Value) AS Value
FROM Data
WHERE ISNUMERIC(Value) = 1
Run Code Online (Sandbox Code Playgroud)

所以显而易见的解决方案是将整个select语句包装在另一个SELECT和WHERE中,并从内部select和filter中返回转换后的值,在那里选择外部select.不幸的是,这是我的Linq-to-sql问题的来源.我不仅过滤了一个范围,而且过滤了很多,或者只是记录的存在(有一些日期范围选择和比较我遗漏了. )

基本上我希望能够生成这样的东西:

SELECT ID, TypeID, Value
FROM Data
WHERE (TypeID = 4 AND ISNUMERIC(Value) AND CONVERT(Float, Value) < 66.6) 
      OR …
Run Code Online (Sandbox Code Playgroud)

t-sql linq-to-sql predicatebuilder

4
推荐指数
1
解决办法
1万
查看次数

VS#8和IIS6之间的C#强制转换不同

我有一段C#代码,它按类型将枚举值添加到下拉列表中.它要求在T1为枚举类型的情况下调用它,尽管我不能将其指定为类型约束,因为枚举是特殊情况,这是不可能的.这不是主要问题,因为它仅在内部使用并记录在案.

Description是System.Enum的扩展,它返回枚举值的DescriptionAttribute的值或值的ToString(如果未指定).

因此,我必须在LINQ语句的Cast部分中转换为System.Enum而不是T1,否则说明扩展不可用.

public static void AddEnum<T1>(this System.Web.UI.WebControls.DropDownList me)
{
    Type t = Enum.GetUnderlyingType(typeof(T1));
    var l = Enum.GetValues(typeof(T1))
                .Cast<System.Enum>()
                .Select(x => new ListItem(x.Description(),
                                          Convert.ChangeType(x, t)
                                                 .ToString()));
    me.Items.AddRange(l.ToArray());
}
Run Code Online (Sandbox Code Playgroud)

这很好,适用于Visual Studio 2008s Web开发服务器,但在IIS 6上运行时失败并出现强制转换异常.它以不变的硬编码可枚举作为填充ASP页面的类型参数运行.

System.InvalidCastException:从'%namespace.class + nameofenum%'到'System.Enum'的转换无效.处于System.Linq.Enumerable.d__b0的System.Convert.ChangeType(对象值,类型conversionType,IFormatProvider提供程序)的System.Convert.DefaultToType(IConvertible值,类型targetType,IFormatProvider提供程序),System.Linq处的1.MoveNext() at System.Linq.Enumerable.<SelectIterator>d__d2.MoveNext().缓冲区1..ctor(IEnumerable1源)在AddEnum [T1]的System.Linq.Enumerable.ToArray [TSource](IEnumerable`1源)(DropDownList me)

(我掩盖的名称空间/类名)

我无法在其他版本的IIS上测试它,但是开发版本与生产系统不匹配似乎很奇怪.有人知道为什么吗?

c# extension-methods iis-6 casting visual-studio-2008

2
推荐指数
1
解决办法
551
查看次数