使用Count()函数将引发“内部.NET Framework数据提供程序错误1025。”

时间:2019-10-08 11:07:05

标签: c# .net linq

这是我的代码:

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(),但仍然收到错误。请帮助

2 个答案:

答案 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本身的类型。