Linq到EF-不支持的函数
本文关键字:函数 不支持 EF- Linq | 更新日期: 2023-09-27 18:25:04
我正在使用Linq进行查询,该查询由实体框架数据源支持。
我得到以下错误:
LINQ to Entities无法识别方法"Double Sqrt(Double)"方法,而此方法无法转换为存储表达式。
这是我的函数的简化版本(我的版本更复杂,使用ACos、sin、cos和其他C#数学类函数)。
var objects =
from n in context.Products.Where(p => p.r == r)
let a = Math.Sqrt((double)n.Latitude)
where a < 5
orderby a
select n;
return objects.Take(100).ToList();
我认为这个问题可能与以下情况有关:与Linq-to-SQL相比,Linq-to-EF(以及SQL数据源)所支持的函数集有限。我对此还比较陌生,所以我不能百分之百确定。
有人能给我一个指向正确方向的指针吗?
干杯,
在SqlFunctions
中定义的Try SquareRoot函数
var objects =
from n in context.Products.Where(p => p.r == r)
let a = SqlFunctions.SquareRoot((double)n.Latitude)
where a < 5
orderby a
select n;
return objects.Take(100).ToList();
如果您开始使用LINQ to对象学习LINQ,那么一旦您开始使用LINQ to Entities,就会遇到很多问题。
您几乎可以在LINQ-to-object中执行任何编译操作,因为LINQ-to-objects在编译时会转换为代码。
LINQ to Entities(和LINQ to SQL)转换为表达式树。因此,只有特定LINQ提供程序允许的语法才是有效的。在我的第一个"for real"LINQ to Entities表达式中,我遇到了大约5次这个错误,因为我一个接一个地删除了LINQ to Entity没有处理的代码。
所以当你看到这一点时,这是正常和常见的。你每次都需要找到另一种方法。
你可以用一个逻辑等价物来避免这个问题:
var objects =
from n in context.Products.Where(p => p.r == r)
where (double)n.Latitude < 25
orderby a
select n;
return objects.Take(100).ToList();
您还可以将所有数据拉到客户端,然后使用LINQ对对象运行代码:
var objects =
from n in context.Products.Where(p => p.r == r).ToList()
let a = Math.Sqrt((double)n.Latitude)
where a < 5
orderby a
select n;
return objects.Take(100).ToList();
最后,您应该能够在服务器上进行此计算。查看System.Data.Objects.SqlClient.SqlFunctionsSqlFunctions类。这些函数将转换为表达式。这看起来特别像是门票。
请尝试
var objects =
from n in context.Products.Where(p => p.r == r)
let a = Math.Pow((double)n.Latitude, 0.5)
where a < 5
orderby a
select n;