2011-11-08 26 views
7

私の.edmxファイルに.dbmlのようにSQL関数を追加できますか?私ができるなら、それをどうやって行うのですか?私ができない場合、回避策はありますか?エンティティフレームワークにSQLユーザ定義関数を追加する方法は?

私はGoogleに挑戦しましたが、その方法について具体的な回答は見つかりませんでした。

私はストアドプロシージャを作成し、 'インポート関数'を追加しようとしましたが、'ストアドプロシージャはカラムを返しません'と表示されます。どこが間違っていますか? 機能:

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

Entity Frameworkの中のSQLユーザー定義関数のサポートが組み込まれ何も、あなたの最善のアプローチは、ラップストアドプロシージャを作成することであろうがありません関数呼び出しを呼び出してその出力を返し、そのプロシージャをEFモデルに追加します。

+0

ありがとうございます。その場合、dc.mytableのpからのvar result = dc.myUSPwithFunc( 'id')のjoin qのようなクエリを書くことができますか? – kandroid

+0

はい、ストアドプロシージャを追加するときに関数インポートを追加する必要があり、戻り値の型は複雑な型になります.EFデザイナは新しい複合型を生成できます。 '複合型'は、実際には、プロシージャから返されたフィールドに基づいた新しいクラスです。 – keithwarren7

+0

こんにちは。私はちょうど通過していないです。 :(私は自分の投稿を編集し、あなたの答えに応じて書くようにしているコードを追加しました。 – kandroid

3

私はこの問題を解決しました。 私がしたのは、私は自分のStored procedureの結果を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

関連する問題