2012-01-10 38 views
6

我使用Linq to Entities,由MySql支持。我希望能夠使用各種內置的MySql函數,例如rand。如果我使用的是MS SQL Server,我可以使用SqlFunctions類,但這不適用於MySql;我得到的錯誤:在MySql和實體框架中使用SqlFunctions或EdmFunctions的等價集合

Rand() on the type 'System.Data.Objects.SqlClient.SqlFunctions' cannot be translated into a LINQ to Entities store expression.

我已經想通了如何創建我的數據庫,它包裝內置的RAND一個用戶定義的函數:

CREATE FUNCTION Random() 
RETURNS real NOT DETERMINISTIC 
RETURN RAND(); 

我然後從數據庫中更新我的模型(我使用的是.ebmx),並創建一個靜態類,像這樣:

public static class MyUserFunctions { 
    [EdmFunction("MyModelNamespace.Store", "Random")] 
    public static double Random() { 
     throw new ArgumentNullException(); 
    } 
} 

這讓我在我的實體類。凡子句中調用MyUserFunctions.Random:

using (MyEntities entities = new MyEntities()) { 
    // Yes, I know ORDER BY RAND() is slow 
    return entities.products.OrderBy(prod => MyUserFunctions.Random()).Take(4); 
} 

所以現在的問題是,我可以做到這一點,而無需創建愚蠢的包裝UDF,只是做(也許通過適當設置EdmFunctionNamespace屬性(在的情況下,所有的內置可更直接MySQL的函數SqlFunctions命名空間是"SqlServer")。

+0

你加入了MySQL .NET連接到您的項目? http://dev.mysql.com/downloads/connector/net/ – nisav 2014-01-30 15:02:32

回答

0

有一些Canonical Functions,所有的供應商必須支持這些,看到這一點:Canonical Functions,但我想沒有Random規範的功能,如果有Random名單上,你可以簡單地創建CLR Method並將其映射到Random通過EdmFunction屬性和EdmNamespaceName,也沒有必要建立在模型中UDF<function> element ...,如果沒有任何Random規範的功能,你可以創建概念性架構定義語言包含一個function元素(CSDL) DefiningExpression元素,並在本節中編寫您的語句(大概在TSQL中),而不是定義UDFDataBase,並確定它input parameterreturn typeCRL function通過EdmFunction映射到它,並從linq查詢調用,看到這一點:Call Model-Defined Functions in Queries