2009-10-23 39 views
3

我需要使用SQRT函數作爲Linq EF查詢中where子句的一部分。我想我可以做到這一點。在Linq EF查詢中使用SQRT

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

但它返回一個錯誤說「‘開方’不能被解析成一個有效的類型構造函數或函數,近函數,方法或類構造函數,第6行,第5欄。 「

我一直認爲linq從字面上理解where子句中的內容,並將其轉換爲直接在SQL中執行的語句。這似乎並不是這樣的...

任何人都知道解決方法嗎?

感謝

+0

我假設你需要比較的數字不總是一個,對吧?原因...如果是...只是不使用sqrt。 Sqrt(1)= 1 – PeterAllenWebb 2009-10-24 04:45:15

+0

Retag。沒有C#3.5(請參閱http://stackoverflow.com/questions/247621/what-are-the-correct-version-numbers-for-c) – Vaccano 2009-11-02 23:14:00

回答

2

我使用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字符串格式來重現相同的代碼,但我可能錯過了一些明顯的東西。

+0

我做過類似的嘗試,除了我使用Math.Sqrt沒有賦值的選擇部分。做一些項目是爲了讓他們在本地工作而不是在某個地方工作? – bugfixr 2009-10-27 14:54:40

+0

LINQ查詢實際上按照它們構建的順序進行操作。 FROM定義源,LET用計算值增加。 WHERE子句現在具有它需要的項目(通過FROM + let構造的子查詢)進行篩選,最後SELECT將值作爲結果提供。將計算放入SELECT中對於WHERE子句的操作來說「太晚了」,而沒有明確地將該結果用作子查詢)。 – Godeke 2009-10-27 15:30:33

+1

嗯。當我寫一些類似於你在這裏使用的東西時,我得到一個NotSupportedException,'LINQ to Entities不能識別'Double Sqrt(Double)'方法,並且這個方法不能被轉換成存儲表達式。你使用EF4嗎? – 2010-11-07 21:07:02

8

我不知道你是如何得到你的答案對EF工作。當我用EF4試用它時,它不適合我。我會得到:

LINQ to Entities無法識別方法'雙Sqrt(雙)​​'方法,並且此方法不能轉換爲存儲表達式。

所以敲我的頭這一段時間後(畢竟,Math.Pow(double)支持,並SQRT是在SQL中使用),我意識到價值的平方根是一樣的半功率。

所以,這個解決方案工作正常。

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

生成的SQL使用POWER而不是SQRT

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

一個很簡單的解決方法,以一個愚蠢的問題。希望這可以幫助別人。

+0

這是針對EF構建的:您可以從我的代碼中看到我們使用的是ObjectQuery,這是一個實體框架概念。然而,由於我的答案是從2009年10月開始,實體框架4在2010年4月推出,我很確定它不是EF4解決方案。我很驚訝,如簡單的查詢會阻止EF4。 – Godeke 2010-11-08 21:33:16

+0

@Godeke。關於日期已經足夠了。但是,這是令人驚訝的。不過,至少有一個解決方法。 – 2010-11-09 00:50:09

0

從EF6開始,您可以使用System.Data.Entity.SqlServer.SqlFunctions.SquareRoot