如何使用Linq和C#在实体框架中获取多个结果集?

在我的存储过程中,我有两个基于两个结果集的select语句我想使用
linq和c#代码获取详细信息.

以下是我的存储过程:

Create Proc SP_GetResult
As
Begin
    Select Id,Name from EmployeeTable;
    Select ContactNo,DateOfBirth from Customer;
End

我尝试下面的代码使用Linq调用存储过程:

Public void SelectValues()
{
    using (Entities1 entity = new Entities1())
    {
       var list = entity.SP_GetResult

       foreach (var test in list)
       {
          var test12123 = test;
       }
    }
}

我只能得到EmployeeTable的详细信息.但是,我无法获得客户表详细信息.

怎么做 ?

任何的想法 ?

最佳答案 这是可以实现的,在MSDN中有一个很好的解释.查看这篇文章,它展示了实现它的两种方法:

https://msdn.microsoft.com/en-us/data/jj691402.aspx

对于您的要求,请使用方法2(在EDMX中配置多个结果集).

一旦你这样做你可以使用Linq没有问题的那些结果.例如

Public void SelectValues()
{
    using (Entities1 entity = new Entities1())
    {
       var Employees = entity.SP_GetResult;
       var Customers = Employees.GetNextResult<Customer>();
       // do your stuff
    }
} 

要“加入”这两个集合你可以使用一个元组集合

Tuple<EmployeeTable, Customer>

由于上述方法仅适用于.NET 4.5及更高版本,因此您可以使用本文中的第一种方法.它也适合你.你可以在那里使用linq.看看我的例子:

public List<EmployeeTable> GetEmployees()
{
using(var ctx = new myEntities())
{
    var cmd = ctx.Database.Connection.CreateCommand();
    cmd.CommandText = "[dbo].[SP_GetResult]";

    var reader = cmd.ExecuteReader(); 
    //reader.NextResult(); <- uncomment this to get second result(Customer)
    var employees = ((IObjectContextAdapter)db) 
        .ObjectContext 
        .Translate<EmployeeTable>(reader, "EmployeeTable", MergeOption.AppendOnly); 
    return employees;
}

现在您可以使用linq:

var boss = GetEmployees().FirstOrDefault(x => x.Name == "BossName");

替代方案:

实际上做这样简单的查询你不需要在一个sp中.你甚至不需要存储过程.只有EF你可以这样得到它:

using (var ctx = new myEntities())
{
    var employyes = from x in ctx.EmployeeTable select new
    {
        id = x.Id,
        name = x.Name
    }
}
点赞