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"
).
bạn đã thêm vào MySQL NET Connector để dự án của bạn? http://dev.mysql.com/downloads/connector/net/ – nisav