0

我正在開發一個遷移項目,我正在將Web窗體應用程序遷移到ASP.NET MVC 4應用程序。實體框架導入並使用根據輸入返回不同結果集的存儲過程

我遇到過這種情況,我需要一點幫助。

在舊的Web窗體項目我已存儲的過程就像...

ALTER PROCEDURE [dbo].[TestMultipleResultSet] 
    @input VARCHAR 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF NOT EXISTS 
    (
     SELECT * FROM Electronics 
     WHERE name = @input 
    ) 
    BEGIN 
     SELECT 101 AS errorcode 
     RETURN 
    END 

    SELECT * FROM Electronics 
    WHERE name = @input 
END 

像上面if not exist檢查,還有許多其他的檢查,以使不同select * from的結果集。

現在我想使用實體框架來執行這個存儲過程,所以我導入了函數,並使用EF提供的Get Column Information + Create Complex Type選項創建了一個複雜類型。

現在它運行時,當我輸入一個有效的@輸入執行SELECT * FROM Electronics WHERE name = @input,但是當我輸入一個不存在的輸入,而不是給我一個101錯誤代碼,它給了我一個錯誤。拋出異常。

異常詳細

數據讀取器是與指定的 'testEFModel.GetTestResults_Result1' 不相容。類型'id'的成員在數據閱讀器中沒有相應的列,名稱相同。

我應該如何解決這個問題?

+1

這是一個非常糟糕的主意**從單個存儲過程返回不同形狀的結果集。 EF不支持這一點 - 而且很可能永遠不會。重新設計你的系統 - 爲你可能得到的每種類型/形狀的結果使用一個存儲過程.... –

回答

1

是否真的有必要使用存儲過程?

使用EF,你可以簡單地做:

var filteredItems = dc.Electronics.Where(e => e.Name == @input).ToList(); 

if (!filteredItems.Any()) 
    throw new ApplicationException("No items were found according to criteria"); 

注:我沒有實際運行上面的代碼;它只是說明了做EF方法的想法

相關問題