在Entity Framework中使用带参数的存储过程

3

我正在使用Entity Framework 6.1.3,并采用数据库优先的方法让其生成模型文件和.EDMX。我还在SQL Server 2008 R2上有以下存储过程,它被Entity Framework带入了EDMX:

CREATE PROCEDURE [dbo].[FindEmployee] 
    @LastName nvarchar(50), 
    @employeeID nvarchar(50),
    @securityID nvarchar(50)
AS
BEGIN
    SET NOCOUNT ON;

    select * 
    from Employee
    where 
        (lastName = dbo.trim(@LastName) AND dbo.trim(@LastName) IS NOT NULL)
        OR  (employeeID = dbo.trim(@employeeID) AND dbo.trim(@employeeID) IS NOT NULL)
        OR  (securityID = dbo.trim(@securityID) AND dbo.trim(@securityID) IS NOT NULL)
    order by
        case when dbo.trim(@LastName) is not null then CONVERT(char(50), lastName) + CONVERT(char(50), firstName) 
                when dbo.trim(@employeeID) is not null then employeeID 
                when dbo.trim(@securityID) is not null then securityID
            end
END

在一个Windows WPF应用程序中,我让用户从下拉框中选择要搜索的列(lastNameemployeeIDsecurityID)。用户提供一个搜索值,该值将被插入到调用存储过程的参数中。然后,存储过程从其SELECT返回结果集,我将使用它来填充DataGrid
我正在尝试在此代码中调用存储过程;请注意,FindEmployee_Result是存储过程的EDMX中自动生成的类:
public FindEmployee_Result SearchEmployees(string lastName, string employeeID, string securityID)
{
    var results = new FindEmployee_Result();

    using (var ctx = new TestSelectionEntities())
    {
        results = ctx.FindEmployee(lastName,employeeID,securityID);
    }

    return results;
}

这段代码出错了,报错信息如下:

无法将类型为“System.Data.Entity.Core.Objects.ObjectResult”的值隐式转换为“TestSelection.data.FindEmployee_Result”

请问我漏掉了什么?谢谢。

它会返回类型为Employee的记录吗? - Ashkan Mobayen Khiabani
我认为它正在返回员工类型的记录。 - Alex
我不确定,但我认为您需要将存储过程导入为函数。请参阅此帖子:https://dev59.com/0FwY5IYBdhLWcg3w2K3c - Salah Akbari
谢谢,@S.Akbari。奇怪的是当我最初运行实体框架工具时,它将存储过程拉入了我的 TestSelection.edmx。所以它在那里,但如何调用它并使用其结果呢? - Alex
1
搞定了... 存储过程返回一个列表,所以我需要将其更改为使用 List<FindEmployee_Result> - Alex
1个回答

5
解决方案是使用一个 List,因为存储过程返回了一个包含 FindEmployee_Result 对象的结果集:
public List<FindEmployee_Result> SearchEmployees(string lastName, string employeeID, string securityID)
{
    using (var ctx = new TestSelectionEntities())
    {
        return ctx.FindEmployee(lastName,employeeID,securityID).ToList();
    }
}

你会把这放在控制器还是模型中?顺便说一句...这非常有帮助 :) +1 - jellz77
@jellz77,很高兴这段代码有所帮助!创建一个数据访问层/服务,该层/服务位于您的EF模型之上。然后,您的控制器调用此数据服务通过存储过程获取数据;然后将数据传递给视图。数据服务只是包含上述方法的类;控制器调用它并获得一个List。稍后,如果您的数据库更改为其他内容,则不必更改控制器。建议的方法是拥有一个逻辑层,由您的控制器调用;逻辑层调用数据服务。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接