2011-11-08 16 views
7

像我在.dbml中一樣,可以將SQL函數添加到我的.edmx文件嗎?如果可以的話,該怎麼做?如果我不能,是否有任何解決方法?如何將SQL用戶定義函數添加到實體框架?

我試圖谷歌,但無法找到任何具體的答案如何做到這一點。

基於給定的答案,我創建了一個存儲過程並試圖添加一個'導入函數',但它說'存儲過程不返回''列。我在哪裏做錯了? 功能:

ALTER FUNCTION [dbo].[fn_locationSearch](@keyword varchar(10)) 
RETURNS TABLE 
AS 
RETURN 
(
SELECT CustomerBranch.ID,CustomerBranch.BranchName,CustomerBranch.Longitude,CustomerBranch.Latitue,CustomerBranch.Telephone,CustomerBranch.CategoryID,CustomerBranch.Description 

FROM FREETEXTTABLE (CustomerOffer,*,@keyword) abc INNER JOIN OffersInBranch 
ON abc.[key]=OffersInBranch.OfferID INNER JOIN CustomerBranch ON  OffersInBranch.BranchID=CustomerBranch.ID 
UNION 
SELECT CustomerBranch.ID,CustomerBranch.BranchName,CustomerBranch.Longitude,CustomerBranch.Latitude,CustomerBranch.Telephone,CustomerBranch.CategoryID,CustomerBranch.Description 
FROM CustomerBranch WHERE FREETEXT(*,@keyword) 
) 

存儲過程:

ALTER PROCEDURE USP_locationSearch 
(@keyword varchar(10)) 
AS 
BEGIN 
SELECT * from dbo.fn_locationSearch(@keyword) 
END 

回答

9

有沒有支持專爲SQL的用戶定義函數在實體框架,你最好的辦法是創建一個存儲過程,而包裹函數調用並返回其輸出,然後將該過程添加到EF模型中。

+0

謝謝。在這種情況下,我將能夠編寫查詢,如var result = from dc.mytable join中的p在dc.myUSPwithFunc('id')...中? – kandroid

+0

是的,當您添加存儲過程時,您將需要添加一個函數導入,並且返回類型將是一個複雜類型,EF設計人員可以爲您生成一個新的複雜類型。 '複雜類型'實際上是一個基於你的過程返回的字段的新類。 – keithwarren7

+0

嗨。我只是沒有通過。 :(我已經編輯了我的帖子,並添加了我試圖按照你的答案寫的代碼。你可以看一下嗎? – kandroid

3

我解決了這個問題。 我所做的是,我把我的存儲過程的結果放到Table變量中並從那裏選擇。

ALTER PROCEDURE [dbo].[USP_locationSearch] 
(@keyword varchar(10)) 
AS 
BEGIN 
DECLARE @locationtable TABLE 
(
ID int, 
BranchName varchar(150), 
Longitude varchar(150), 
Latitude varchar(150), 
Telephone varchar(50), 
CategoryID int, 
Description varchar(500) 
) 
INSERT INTO @locationtable SELECT * from dbo.fn_locationSearch(@keyword) 
SELECT * FROM @locationtable 
END 

然後刷新實體框架中的存儲過程。然後添加「功能輸入」。一切都變得很酷。

關於此問題的更多詳細資料可以發現here

相關問題