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数据源)所支持的函数集有限。我对此还比较陌生,所以我不能百分之百确定。

有人能给我一个指向正确方向的指针吗?

干杯,

Linq到EF-不支持的函数

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;