8

Tôi có một hàm vô hướng có giá trị trong DB của tôi:Làm thế nào để gọi hàm vô hướng có giá trị từ LINQ to Entities server-side

ALTER FUNCTION [dbo].[fx_fooFunct] 
    (@MyParam varchar(max)) 
RETURNS varchar(max) 
AS 
BEGIN 
    return @MyParam 
END 

Tôi muốn gọi chức năng này từ một LINQ to Entities truy vấn và nhận được kết quả vào một biến:

let result = this.ObjectContext.ExecuteFunction<string>("SELECT dbo.fx_fooFunct(@MyParam)", new ObjectParameter("MyParam", "hello world")).FirstOrDefault() 

Nhưng, khi tôi thực thi mã, tôi nhận được lỗi này:

LINQ to Entities does not recognize the method 'System.Data.Objects.ObjectResult`1[System.String] ExecuteFunction[String](System.String, System.Data.Objects.ObjectParameter[])' method, and this method cannot be translated into a store expression.

tôi khác nfo:

Đây là một phần tất cả truy vấn đang chạy trên máy chủ.
Trả lại tất cả dữ liệu và sử dụng LINQ to Objects không phải là một tùy chọn do hiệu suất.

Tôi không chắc rằng tôi có loại trả về là ExecuteFunction chính xác, nhưng tôi không chắc chắn điều gì khác có thể là ... Tôi đang làm gì sai?

Sửa
Với sự giúp đỡ của câu trả lời Ladislav Mrnka của, đây là giải pháp:

Tạo phương pháp helper để lộ hàm SQL:

public class CustomSqlFunctions 
{ 
    [EdmFunction("MyModel.Store", "fx_fooFunct")] 
    public static string FooFunct(string myParam) 
    { 
     throw new NotSupportedException("Direct calls not supported"); 
    } 
} 

Các LINQ bây giờ sẽ đọc:

let result = CustomSqlFunctions.FooFunct("hello world") 

Trả lời

9

Bạn có chức năng được ánh xạ trong EDMX chưa? Tôi đoán bạn không.

Run Cập nhật cơ sở dữ liệu từ phù thủy trong thiết kế và theo thủ tục được lưu trữ chọn chức năng SQL của bạn để nhập khẩu và làm theo this article để tạo ra phương pháp helper được đánh dấu bằng EdmFunctionAttribute để lộ hàm SQL cho LINQ-TO-Entities.

Lưu ý: Các hàm SQL không được hỗ trợ trong mã đầu tiên/lưu loát-API. Bạn cần sử dụng ánh xạ với EDMX.

ExecuteFunction được sử dụng để gọi các đối tượng địa lý được ánh xạ trong EDMX - nó dự kiến ​​tên của đối tượng địa lý được ánh xạ (nhập hàm của thủ tục được lưu trữ). MSDN nói rằng nó cũng có thể gọi các hàm được ánh xạ nhưng tôi không biết làm thế nào - nó gọi hàm import và nhập hàm SQL không có bất kỳ hàm nào.

+0

Tuyệt vời, cảm ơn rất nhiều. Tôi đã cập nhật câu hỏi của mình với giải pháp. – mcqwerty

0

Vâng, bạn cần phải sửa đổi SQL để chuyển đổi giá trị đơn/vô hướng thành hàm bảng có giá trị sau đó nó sẽ hoạt động. Vì không có sự hỗ trợ cho chức năng vô hướng có giá trị chưa https://social.msdn.microsoft.com/Forums/en-US/756865e5-ff25-4f5f-aad8-fed9d741c05d/add-scalar-function-to-function-import-folder-in-model-browser-of-entity-framework-40-edmx?forum=adodotnetentityframework

Scalar function as it was, which doesn't work

CREATE FUNCTION [dbo].[GetSha256] 
(
    -- Add the parameters for the function here 
    @str nvarchar(max) 
) 
RETURNS VARBINARY(32) 
AS 
BEGIN 
    RETURN (SELECT * FROM HASHBYTES('SHA2_256', @str) AS HASH256); 
END -- this doesn't work. 

Scalar function -> Converted to Table Valued function , it works

CREATE FUNCTION [dbo].[GetSha2561] 
(
    -- Add the parameters for the function here 
    @str nvarchar(max) 
) 
RETURNS @returnList TABLE (CODE varbinary(32)) 
AS 
BEGIN 

    INSERT INTO @returnList 
    SELECT HASHBYTES('SHA2_256', @str); 

    RETURN; -- This one works like a charm. 

END 
Các vấn đề liên quan