SQL将选定结果返回给EF

时间:2017-07-05 04:36:37

标签: c# .net sql-server entity-framework

在Entity Framework中,我尝试执行这两个查询:

查询#1:

var deptInput = new SqlParameter("@DepartmentName", deptString);
var departmentTable = Database.Users.FromSql("EXECUTE dbo.
[ViewEmployeeListByDepartment] @DepartmentName", deptInput).ToList();

查询#2:

var deptInput = new SqlParameter("@DepartmentName", deptString);
var departmentTable = Database.Database.ExecuteSqlCommand("EXECUTE dbo.
[ViewEmployeeListByDepartment] @DepartmentName", deptInput);

这是我在SQL Server中的存储过程:

Declare @CounterForEmployees int
Declare @NumberOfEmployees int
Declare @TableCount int = 1

Declare @DepartmentTable TABLE(
    Id nvarchar(450),
    UserName nvarchar(256),
    Display_Name nvarchar(256),
    Direct_Supervisor nvarchar(256),
    Ranking int 
);

SET @NumberOfEmployees = (SELECT Count(*) 
                          FROM dbo.[User]
                          WHERE Department = @DepartmentName)
SET @CounterForEmployees = 0

--Get the HOD of the Department First
INSERT INTO @DepartmentTable
    SELECT 
        Id, UserName, Display_Name, Direct_Supervisor, ''  
    FROM 
        [ASEAppraisalDB].[dbo].[User]
    WHERE
        Department = @DepartmentName AND 
        UserName IN (SELECT Distinct(Head_Of_Department)
                     FROM [ASEAppraisalDB].[dbo].[User]
                     WHERE Department = @DepartmentName)

UPDATE @DepartmentTable 
SET Ranking = @TableCount 
WHERE Ranking = 0
.
. 
.
.
.
.
. 
.
SELECT * FROM @DepartmentTable

当我执行第一个时,它会返回一条错误消息,指出dbo.[User]表中的@DepartmentTable表中缺少列。 dbo.[User]表中有一些我未选择@DepartmentTable的列。

当我执行第二个时,它只返回一个数字(即员工数)。似乎第二个查询只选择了计算员工的部分。我的代码的其他部分只需要员工数量来计算while循环。我不需要将它归还给EF。

我只希望将select * from @DepartmentTable的结果返回给Entity Framework。在SQL Server对象资源管理器中的存储过程的参数中,它还表示它返回如下所示的整数:

enter image description here

我该如何解决这个问题?此外,哪种查询更有效,更正确“#39;使用?

2 个答案:

答案 0 :(得分:0)

当您将存储过程映射到enfity框架中的.edmx文件时,创建一个复杂类型。 Like this

首先单击Generate column Information,然后单击Create New Complex Type

我将从复杂类型中得出结果。 由于我使用的是存储库模式,因此我创建了一个通用函数,用于在我的代码中执行存储过程,该函数将存储过程的名称作为字符串和sql参数列表。

public List<T> ExecuteStoredProc(string StoredProcName, List<SqlParameter> parameters)
    {
        List<T> list = null;
        try
        {

            if (!string.IsNullOrEmpty(StoredProcName))
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("Exec ");
                sb.Append(StoredProcName);

                foreach (SqlParameter item in parameters)
                {
                    if (list == null)
                    {
                        sb.Append(" @");
                        list = new List<T>();
                    }
                    else
                    {
                        sb.Append(", @");
                    }
                    sb.Append(item.ParameterName);
                    if (item.Direction == System.Data.ParameterDirection.Output)
                    {
                        sb.Append(" OUT");
                    }
                }

                list = Context.Database.SqlQuery<T>(sb.ToString(), parameters.Cast<object>().ToArray()).ToList();
            }

        }
        catch (SqlException ex)
        {
            //RAISERROR() has limitation of 255 characters, so complete error message is being passed through output parameter : @ErrorMessage
            if (parameters != null && parameters.Count > 0)
            {
                SqlParameter param = parameters.FirstOrDefault(a => a.Direction == ParameterDirection.Output && a.ParameterName == Constants.Constant.ParamErrorMessage);
                if (param != null)
                {
                    string errorMessage = Convert.ToString(param.Value);
                    if (!string.IsNullOrEmpty(errorMessage))
                    {
                        throw new JcomSqlException(errorMessage, ex);
                    }
                }
            }

            throw new JcomSqlException(ex.Message, ex);
        }
        return list;
    }

    Then use it with your repository 

       List<GetDepartmentDetails_Result> getDepts(string deptName)
    {
        List<SqlParameter> spm = new List<SqlParameter>()
        {
            new SqlParameter() { ParameterName="@DepartmentName", Value=deptName}
        };
        var result = this.UnitOfWork.GetRepository<GetDepartmentDetails_Result>().ExecuteStoredProc("GetDepartmentDetails", spm);
        return result;

    }

答案 1 :(得分:-1)

所有存储过程仅返回integer。它还返回多个数据表的数据。

在执行存储过程时检入SQL Server它返回SQL Server中的两组数据表,可选择返回int。

您可以验证此链接RETURN (Transact-SQL)