实体框架导入并使用存储过程,该存储过程根据输入返回不同的结果集

时间:2012-11-06 13:51:13

标签: asp.net-mvc sql-server-2008 entity-framework entity-framework-4 asp.net-mvc-4

我正在开发一个迁移项目,我将Web表单应用程序迁移到ASP.NET MVC 4应用程序。

我遇到过这种情况,我需要一些帮助。

在旧的Web表单项目中,我存储了proc ... ...

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作为结果集。

现在我想使用Entity框架来执行这个存储过程,所以我导入了该函数并使用EF提供的Get Column Information + Create Complex Type选项创建了一个复杂类型。

现在它在我输入执行SELECT * FROM Electronics WHERE name = @input的有效@input时运行但是当我输入一个不存在的输入而不是返回101错误代码时它会给我一个错误。抛出异常。

异常详情

  

数据阅读器与指定的'testEFModel.GetTestResults_Result1'不兼容。类型为“id”的成员在数据读取器中没有相应的具有相同名称的列。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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方式做事的想法