在 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,但要小心,尽量不要使用 AsEnumerableToList整个 DbSet 因为您将检索 table 影响应用程序性能的所有行。

现在如果你只想检查天气 Col1 是否是一个数值,另一种解决方案可能是使用 SqlFunctions.IsNumeric 方法,它被翻译成原生 SQL:

using System.Data.Entity.SqlServer;
//...

source.Where(x=> SqlFunctions.IsNumeric(x.Col1)==1);

您可以找到另一组函数,您也可以在 DbFunctions 静态 class 中调用。SqlFunctions 是 SQL 服务器特定的,而 DbFunctions不是。