如何使用Entity Framework将可选参数传递给存储过程?

时间:2015-11-03 06:49:13

标签: entity-framework linq asp.net-mvc-4 stored-procedures optional-parameters

我有以下存储过程,返回1000行。

ALTER PROC [dbo].[PROC_Insights_offinvoice_taxmaster]
@PROC_TYPE VARCHAR(50),@SEARCHBY VARCHAR(50) = NULL , @SEARCHVALUE     VARCHAR(250) = NULL
AS
BEGIN
    DECLARE @SQLQUERY VARCHAR(MAX)
    IF(@PROC_TYPE = 'DISPLAY')
    BEGIN

    SET @SQLQUERY = '
    SELECT  [taxUID],[taxCode],[formatUID],[formatName],[taxDescription],[classcode],[classDescription],[locationShortName],
            [zoneUID],[zoneName],[taxValue],[taxPercentage],[createdBy],[createdDate],[modifiedBy],[modifiedDate],[fy_Year]
    FROM [Insights].[dbo].[Insights_offinvoice_taxmaster]
    WHERE 1 = 1 '
    IF @SEARCHBY IS NOT NULL
    BEGIN
    SET @SQLQUERY  = @SQLQUERY  + 'AND '+ @SEARCHBY + ' like ' + '''' + '%' + @SEARCHVALUE + '%' + ''''
        END

        EXECUTE(@SQLQUERY)
    END

END

我使用以下方法调用存储过程。

var context = new InsightsEntities();
var param = new SqlParameter[3];
param[0] = new SqlParameter { ParameterName = "@PROC_TYPE", Value = "DISPLAY" };
param[1] = new SqlParameter { ParameterName = "@SEARCHBY", Value = "TaxValue" };
param[2] = new SqlParameter { ParameterName = "@SEARCHVALUE", Value = "1000" };

IEnumerable<Insights_offinvoice_taxmaster> tbl = context.Database.SqlQuery<Insights_offinvoice_taxmaster>("exec PROC_Insights_offinvoice_taxmaster @PROC_TYPE, @SEARCHBY, @SEARCHVALUE", param).ToList();

当我传递所有三个参数时,这个工作正常。假设如果我只传递第一个参数,它会显示错误以传递剩余的两个参数。如何在实体框架中使用可选参数?

1 个答案:

答案 0 :(得分:0)

你得到的错误是因为你错过了一个参数,还是因为你有一个包含3个项目的数组而且其中一些是空的?当我有一个带有可选参数的SP时,我只需添加我需要发送到列表的内容,然后在SP调用之前将列表转换为数组。

<html>
<head>
    <style type="text/css">
        .block1 {
            color: red;
            width: 100px;
            border: 1px solid green;
        }
        .block2 {
            color: blue;
            width: 70px;
            border: 2px solid black;
            position: relative;
            float: right;
        }
    </style>
</head>
<body>
    <div class='block1'>
        <div class='block2'>block2</div>
        <p>text</p>
        <p>text2</p>
    </div>
</body>