在LINQ查询中调用函数

时间:2015-12-03 13:01:06

标签: entity-framework linq linq-to-sql linq-to-entities

我的问题是如何在LINQ查询中调用函数? e.g

source.Where(x=> double.Parse(x.Col1)==3)

source.Where(x=> AnyUserFunction(x.Col1)==true)

基本上我的要求是检查天气Col1是否是数字值,但我偶尔也需要调用我的用户自定义函数。

2 个答案:

答案 0 :(得分:3)

问题是您的Linq to Entities提供程序不知道如何将自定义方法转换为SQL。 @teovankot提出的解决方案是解决此问题的简便方法,但如果您想使用Linq to Objects,我建议您使用AsEnumerable扩展方法代替ToList,因为AsEnumerable在您查阅数据之前不会执行查询,它会保留deferred execution,但要小心,尽量不要在整个AsEnumerable上使用ToListDbSet因为您检索该表的所有行会影响您的应用程序的性能。

现在,如果您只想检查天气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到可以轻松使用用户定义的函数的对象。