在我的存储过程中,我有两个基于两个结果集的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
}
}