我的问题是如何在LINQ查询中调用函数? e.g
source.Where(x=> double.Parse(x.Col1)==3)
或
source.Where(x=> AnyUserFunction(x.Col1)==true)
基本上我的要求是检查天气Col1是否是数字值,但我偶尔也需要调用我的用户自定义函数。
答案 0 :(得分:3)
问题是您的Linq to Entities提供程序不知道如何将自定义方法转换为SQL。 @teovankot提出的解决方案是解决此问题的简便方法,但如果您想使用Linq to Objects,我建议您使用AsEnumerable
扩展方法代替ToList
,因为AsEnumerable
在您查阅数据之前不会执行查询,它会保留deferred execution,但要小心,尽量不要在整个AsEnumerable
上使用ToList
或DbSet
因为您检索该表的所有行会影响您的应用程序的性能。
现在,如果您只想检查天气Col1
是否为数值,则另一种解决方案可能是使用SqlFunctions.IsNumeric方法转换为本机SQL:
using System.Data.Entity.SqlServer;
//...
source.Where(x=> SqlFunctions.IsNumeric(x.Col1)==1);
您可以在DbFunctions
静态类中找到另一组函数。SqlFunctions
是特定于SQL Server的,而DbFunctions
则不是。
答案 1 :(得分:1)
您无法在linq to sql中轻松调用用户定义的函数。
但是,在将所有数据从数据库传输到服务器之后,您就可以执行此操作。像这样:
source.ToList().Where(x=> AnyUserFunction(x.Col1)==true)
注意ToList()
电话。这将从数据库中获取所有数据,因此您基本上可以使用linq到可以轻松使用用户定义的函数的对象。