代码之家  ›  专栏  ›  技术社区  ›  bugfixr

在linq ef查询中使用sqrt

  •  3
  • bugfixr  · 技术社区  · 16 年前

    我需要使用sqrt函数作为linq ef查询中where子句的一部分。我想我可以这样做:

    var qry = context.MyTable.Where("sqrt(it.field) > 1");
    

    但它返回一个错误,即“sqrt”无法解析为有效的类型构造函数或函数,靠近函数、方法或类型构造函数,第6行第5列。

    我一直假设Linq从字面上获取where子句中的内容,并将其转换为直接在SQL中执行的语句。似乎不是这样的…

    有人知道周围的工作吗?

    谢谢

    4 回复  |  直到 11 年前
        1
  •  2
  •   Godeke    16 年前

    我正在使用Linq实体,并且能够做到:

            testEntities entities = new testEntities ();
    
            ObjectQuery<Fees> fees = entities.Fees;
    
            return from f in fees 
                   let s = Math.Sqrt((double)f.FeeAmount)
                   where s > 1.0 
                   select f ;
    

    当我检查生成的SQL时,我得到

    SELECT [t1].[TestTriggerID]
    FROM (
        SELECT [t0].[TestTriggerID], SQRT(CONVERT(Float,[t0].[TestTriggerID])) AS [value]
        FROM [TestTrigger2] AS [t0]
        ) AS [t1]
    WHERE [t1].[value] > @p0
    

    这似乎是合理的。我无法使用.where字符串格式来复制相同的代码,但我可能遗漏了一些明显的内容。

        2
  •  8
  •   Drew Noakes    15 年前

    我不知道你是怎么得到答案的。当我用EF4测试的时候,它对我不起作用。我会得到:

    linq to entities无法识别方法“double sqrt(double)”方法,并且此方法无法转换为存储表达式。

    所以在我的头撞了一会儿之后(毕竟, Math.Pow(double) 支持,以及 SQRT 在SQL中是可用的),我意识到一个值的平方根与它的一半的幂相同。

    所以,这个解决方案是可行的。

    from e in context.MyEntities
         let s = Math.Pow(e.MyDouble, 0.5)
         select s;
    

    生成的SQL使用 POWER 而不是 平方正交函数 :

    SELECT 
    POWER( CAST( [Extent1].[MyDouble] AS float), cast(0.5 as float(53))) AS [C1]
    FROM [dbo].[MyEntities] AS [Extent1]
    

    一个足够简单的解决愚蠢问题的方法。希望这能帮助别人。

        3
  •  1
  •   Laurel.Wu    16 年前

    检查 msdn document .Entity SQL不支持sqrt函数。

        4
  •  0
  •   Nathan Phillips    11 年前

    你可以使用 System.Data.Entity.SqlServer.SqlFunctions.SquareRoot 至于EF6。

    推荐文章