2

以下のロジックを見つけることができるストアド プロシージャがあります。この sp を EF {バージョン 5.0} に渡すと、この sp は戻り値の型を int として受け取ります。

Create Proc  SP_GetResultBasedOnFilterForCoverage
(
 @AgeID int,
 @IncomeID int,
 @GenderID int,
 @EducationID int,
 @ProductID int
)
as
set nocount on
Declare  @query varchar(max), @index  int, @totalrow int, @coverageTotal bigint
IF OBJECT_ID('tempdb..#SecondDataSet') IS NOT NULL
    DROP TABLE #SecondDataSet
Create table #SecondDataSet
(
CoverageID int,
  Coverage varchar(100),
  Percentage float
) 

Declare @CoverageTable Table
(
  id int identity(1,1),
  CoverageID  int,
  Coverage varchar(100),
  CoverageCount int   
)

insert into @CoverageTable
(CoverageID,Coverage,CoverageCount)
Select TCPC.CoverageID,Coverage.Coverage, COUNT(CustomerID) from TBL_Customer_Product_Choice as  TCPC
inner join 
Tbl_Coverage as coverage
on 
coverage.CoverageID = TCPC.CoverageID
group by 
TCPC.CoverageID,coverage.Coverage



set @index = 1;
Select @totalrow =  COUNT(ID) from @CoverageTable

While(@index <= @totalrow)
begin
Declare @CurrentCoverageID int
Select  @coverageTotal = CoverageCount, @CurrentCoverageID = CoverageID from @CoverageTable where id = @index
set @query  = '
 Insert into #SecondDataSet 
 (Percentage,CoverageID,Coverage)

Select Round((Cast(COUNT(TCPC.CustomerID) as float)/cast('+cast(@coverageTotal as varchar)+' as  bigint)) * 100,1)  as Percentage ,
TCPC.CoverageID ,TC.Coverage 
from  Tbl_customer_Product_Choice as TCPC
inner  join 
Tbl_Coverage as  TC
on 
TCPC.CoverageID = TC.CoverageID
Where productID = cast('+cast(@ProductID as varchar)+'as int)  and TCPC.CoverageID = cast('+ cast(@CurrentCoverageID as varchar)+' as  int)'

if(@AgeID <> 0)
begin

  set  @query += ' and  AgeID = ' + CAST(@AgeID as  varchar);
End

if( @IncomeID != 0)
begin
  set  @query += ' and  IncomeID = ' + CAST(@IncomeID as  varchar);
End

if(@EducationID != 0)
begin
  set  @query += ' and  EducationID = ' + CAST(@EducationID as  varchar);
End

if(@GenderID > -1)
begin
  set  @query += ' and  GenderID = ' + CAST(@GenderID as  varchar);
End

set @query += ' group  by  TCPC.CoverageID,TC.Coverage
order by  COUNT(TCPC.CustomerID) desc
'
Exec(@query)
set  @index = @index + 1;
end

Select * from #SecondDataSet
4

1 に答える 1

1

最近、この問題に遭遇しました。EFはSPを自動生成できません。手動で追加する必要があります。その結果、以下の方法を適用しました。

その私の例SP:


CREATE TABLE #LocalTempTable
(
    c1 INT,
    c2 INT, 
    c3 NVARCHAR(50),
    c4 INT
)

SELECT * FROM #LocalTempTable

新しい複合型を追加します (一時テーブルの戻り列用):

1-.edmxソリューション エクスプローラーからファイルを開く

2-開いているウィンドウから右クリックしてスペースを空にし、「新規追加->複合型」

3-タイプの名前を変更し、モデルブラウザで名前を変更したタイプを右クリックしてから、「追加->スカラープロパティ-> COLUMN_TYPE」

私のSPリターン4列。int32, int32, string, int32. 戻り値の型がnullableプロパティ ウィンドウから変更できる場合

5- これで、データベースから SP をインポートできます。モデル ブラウザーで [関数のインポート] を右クリックし、[関数のインポートの追加] をクリックします。

6- カスタム名を書きます (注: この名前の分離コードを使用します) ストアド プロシージャを選択します。複合にチェックマークを付け、作成された複合タイプを選択してからOK。

今SPをテストする

DBEntities db = new SIRAMATIKEntities();
List<complex_type> result= db.FunctionName(data).ToList();

返された列名が複合型の列と異なる場合は、Mapping Details から変更できます。モデル ブラウザで、作成した関数を右クリックし、[関数のインポート マッピング] をクリックします。

お役に立てば幸いです。スペルが間違っていたらごめんなさい。私は翻訳を使用します。

于 2016-07-28T11:23:21.300 に答える