在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对象资源管理器中的存储过程的参数中,它还表示它返回如下所示的整数:
我该如何解决这个问题?此外,哪种查询更有效,更正确“#39;使用?
答案 0 :(得分:0)
当您将存储过程映射到enfity框架中的.edmx文件时,创建一个复杂类型。
首先单击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)