在 LINQ 查询中调用函数
Calling functions in a LINQ query
我的问题是如何在 LINQ 查询中调用函数?例如
source.Where(x=> double.Parse(x.Col1)==3)
或
source.Where(x=> AnyUserFunction(x.Col1)==true)
基本上我的要求是检查天气 Col1 是否是一个数值,但我偶尔也需要调用我的用户定义函数。
您无法在 linq to sql 中轻松调用用户定义的函数。
但是您可以在将所有数据从数据库获取到服务器后执行此操作。像这样:
source.ToList().Where(x=> AnyUserFunction(x.Col1)==true)
注ToList()
调用。这将从数据库中获取所有数据,因此您基本上使用 linq to 对象,您可以在其中轻松使用用户定义的函数。
问题是您的 Linq to Entities 提供程序不知道如何将您的自定义方法转换为 SQL。 @teovankot 提出的解决方案是解决这个问题的简单方法,但是如果你想使用 Linq to Objects I suggest you use AsEnumerable
extension method instead ToList
because AsEnumerable
does not execute the query until you consult the data, it preserves deferred execution,但要小心,尽量不要使用 AsEnumerable
或 ToList
整个 DbSet
因为您将检索 table 影响应用程序性能的所有行。
现在如果你只想检查天气 Col1
是否是一个数值,另一种解决方案可能是使用 SqlFunctions.IsNumeric 方法,它被翻译成原生 SQL:
using System.Data.Entity.SqlServer;
//...
source.Where(x=> SqlFunctions.IsNumeric(x.Col1)==1);
您可以找到另一组函数,您也可以在 DbFunctions
静态 class 中调用。SqlFunctions
是 SQL 服务器特定的,而 DbFunctions
不是。
我的问题是如何在 LINQ 查询中调用函数?例如
source.Where(x=> double.Parse(x.Col1)==3)
或
source.Where(x=> AnyUserFunction(x.Col1)==true)
基本上我的要求是检查天气 Col1 是否是一个数值,但我偶尔也需要调用我的用户定义函数。
您无法在 linq to sql 中轻松调用用户定义的函数。
但是您可以在将所有数据从数据库获取到服务器后执行此操作。像这样:
source.ToList().Where(x=> AnyUserFunction(x.Col1)==true)
注ToList()
调用。这将从数据库中获取所有数据,因此您基本上使用 linq to 对象,您可以在其中轻松使用用户定义的函数。
问题是您的 Linq to Entities 提供程序不知道如何将您的自定义方法转换为 SQL。 @teovankot 提出的解决方案是解决这个问题的简单方法,但是如果你想使用 Linq to Objects I suggest you use AsEnumerable
extension method instead ToList
because AsEnumerable
does not execute the query until you consult the data, it preserves deferred execution,但要小心,尽量不要使用 AsEnumerable
或 ToList
整个 DbSet
因为您将检索 table 影响应用程序性能的所有行。
现在如果你只想检查天气 Col1
是否是一个数值,另一种解决方案可能是使用 SqlFunctions.IsNumeric 方法,它被翻译成原生 SQL:
using System.Data.Entity.SqlServer;
//...
source.Where(x=> SqlFunctions.IsNumeric(x.Col1)==1);
您可以找到另一组函数,您也可以在 DbFunctions
静态 class 中调用。SqlFunctions
是 SQL 服务器特定的,而 DbFunctions
不是。