使用实体框架从存储过程中检索表数据

Rik*_*iki 5 c# sql-server stored-procedures entity-framework entity-framework-6

我正在使用Entity Framework v6.我有一个存储过程,如下所示

CREATE PROCEDURE [dbo].[GetCountryList] 
(
    @CustomerName VARCHAR(MAX), 
    @SearchCriteria VARCHAR(MAX)
)
AS
    BEGIN
    SET NOCOUNT ON

        SELECT CountryID, CountryName FROM dbo.Table1 
        WHERE CustomerName = @CustomerName AND CountryName = @SearchCriteria
    END
Run Code Online (Sandbox Code Playgroud)

现在我有一个模型类

public class CountryName
{
    public int CountryId { get; set; }
    public string CountryName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所以我想SELECT在一个List<CountryName>类型中获得查询的结果

List<CountryName> countryList = null;

using (DbEntities dbContext = new DbEntities())
{
    countryList = //my code to collect the result
}
Run Code Online (Sandbox Code Playgroud)

好吧,我可以直接在表上运行LINQ to SQL,但不幸的是我要求从存储过程中获取数据.那么,我该怎么做呢?

Sal*_*ari 11

  1. 您需要将存储过程作为函数导入.右键单击实体模型的工作区区域,然后选择Add -> Function Import.
  2. 在"添加功能导入"对话框中,输入您希望在模型中引用存储过程的名称,例如GetCountryListSP,从下拉列表中选择您的过程,然后选择要返回的过程值,并从下拉列表中进行Entities选择CountryName.名单.
  3. 然后在代码中:

    var result = db.GetCountryListSP();//Send parameters too
    
    Run Code Online (Sandbox Code Playgroud)

    使用此方法可以防止返回-1存储过程.有关Entity Framework存储过程问题的更多详细信息,请查看帖子.


Ant*_*rko 6

您可以导入而无需导入。像这样:

var countryList = dbContext.Database.SqlQuery<CountryName>("[GetCountryList]").ToList();
Run Code Online (Sandbox Code Playgroud)

EntityFramework有时无法识别或导入SP)))因此,这就是为什么我使用此代码段节省时间的原因。