2012-01-10 5 views
6

Tôi đang sử dụng LINQ to Entities, được hỗ trợ bởi MySql. Tôi muốn có thể sử dụng các hàm MySql được xây dựng khác nhau như rand. Nếu tôi đã sử dụng MS SQL Server tôi có thể sử dụng lớp SqlFunctions, nhưng điều này không làm việc với MySql; Tôi nhận được lỗi:Sử dụng SqlFunctions hoặc Bộ sưu tập tương đương của EdmFunctions với MySql và khung thực thể

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

tôi đã tìm ra cách tạo một người dùng được xác định chức năng trên cơ sở dữ liệu của tôi mà kết thúc tốt đẹp được xây dựng trong RAND:

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

sau đó tôi cập nhật mô hình của tôi từ cơ sở dữ liệu (tôi đang sử dụng một .ebmx), và tạo ra một lớp tĩnh như vậy:

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

và cho phép tôi gọi MyUserFunctions.Random trong một điều khoản .Where trên lớp Đối tượng của tôi:

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

Vì vậy, câu hỏi là, tôi có thể làm điều này mà không cần tạo các wrapper UDF ngu ngốc, và chỉ làm cho tất cả được xây dựng trong MySql chức năng có sẵn trực tiếp hơn (có lẽ bằng cách thiết lập Namespace tài sản 's EdmFunction đúng cách (trong trường hợp SqlFunctions không gian tên là "SqlServer").

+0

bạn đã thêm vào MySQL NET Connector để dự án của bạn? http://dev.mysql.com/downloads/connector/net/ – nisav

Trả lời

0

có một số Canonical Functions rằng tất cả các nhà cung cấp phải hỗ trợ những, thấy điều này: Canonical Functions, nhưng tôi đoán không có Random chức năng kinh điển, nếu có Random trong danh sách, bạn chỉ có thể tạo CLR Method và bản đồ nó để Random bởi thuộc tính EdmFunctionEdmNamespaceName và không cần phải tạo UDF<function> element trong mô hình của bạn ..., nếu không có bất kỳ chức năng nào là Random, bạn có thể tạo phần tử function trong ngôn ngữ định nghĩa lược đồ khái niệm (CSDL) DefiningExpression phần tử và viết câu lệnh của bạn (trong TSQL có thể) trong phần này, thay vì xác định UDF trong DataBase, và xác định input parameterreturn type cho nó, và bản đồ một CRL function bởi EdmFunction với nó, và gọi từ linq truy vấn, thấy điều này: Call Model-Defined Functions in Queries