这是我的代码:
var icdCodes = DbContext.MasterIcd.Select(x => x.IcdCode).AsQueryable();
var count = icdCodes.Where(x => !x.Any(char.IsDigit)).Count();
我正在尝试查找不包含任何字符的IcdCode。但是使用count会引发以下错误:“内部.NET Framework数据提供程序错误1025。”
如Internal .NET Framework Data Provider error 1025中所述,我正在使用AsQuerable(),但仍然收到错误。请帮助
答案 0 :(得分:6)
AsQueryable()
无法解决相同错误的 other 原因。正如Casting LINQ expression throws "Internal .NET Framework Data Provider error 1025."中所解释的那样,问题在于Where(x => !x.Any(char.IsDigit))
无法转换为SQL。
您使用的C#代码将字符串视为char数组,并调用一个使用Unicode查找表的函数来检查每个字符是否为数字。
其T-SQL变体为ISNUMERIC
。参见How to know if a field is numeric in Linq To SQL:
DbContext.MasterIcd
.Select(x => x.IcdCode)
.Where(i => SqlFunctions.IsNumeric(i) == 1)
.ToList();
答案 1 :(得分:0)
不是每个请求都可以翻译成SQL。将字符串拆分为字符数组并对其执行数组选项可能是其中之一。
方法A。 您在内存中加载了所有字符串(用ToList()替换AsQueryable) 并在本地进行测试。 (您的代码可以)。
方法B。 如果您的IcdCode的长度是有限的(最多9个),则可能会更简单,只需将TryParse解析为int或long即可,如果需要,请禁止使用符号。使用这种类型转换方法,还可以使用SQL表示解决方案。 (比起是否可以进行转换等)。但是有时很难找出如何用C#表示可以转换为SQL的东西,这是在执行LINQ to SQL时实际完成的工作,并且仍然取决于SQL-Server本身的类型。