如果使用LINQ to SP和SP返回多个记录集,则DBML中缺少架构

如果使用LINQ to SP和SP返回多个记录集,则DBML中缺少架构,linq,linq-to-sql,linq-to-entities,Linq,Linq To Sql,Linq To Entities,在制作LINQtoSQL和实体的POC时,我遇到了一个陷入死角的问题。 问题是,我使用LINQ到SP,一切都很好,我制作了很酷的编辑、添加和删除方法。然后在我的矿井里点击“如果我只是从SP返回两个记录集怎么办?”。我制作了一个SP并从中返回了两个记录集 SP看起来像这个[演示] Create PROCEDURE [dbo].GetUserData @UserId Bigint AS BEGIN SET NOCOUNT ON; -- Getting User select *

在制作LINQtoSQL和实体的POC时,我遇到了一个陷入死角的问题。 问题是,我使用LINQ到SP,一切都很好,我制作了很酷的编辑、添加和删除方法。然后在我的矿井里点击“如果我只是从SP返回两个记录集怎么办?”。我制作了一个SP并从中返回了两个记录集

SP看起来像这个[演示]

Create PROCEDURE [dbo].GetUserData

    @UserId Bigint

AS
BEGIN
    SET NOCOUNT ON;

-- Getting User
select * from [User] where id=@UserId
-- Getting User's role
select * from [Role] where userId=@UserId
end
然后我在我的DBML(Linq到SQL类)中删除了该SP,然后在这里我注意到只有一个记录集的模式是这样创建的

<?xml version="1.0" encoding="utf-8"?>
<Database Name="MyInventory" Class="MyDBMLDataContext" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
  <Connection Mode="AppSettings" ConnectionString="Data Source=MyDatabaseServer\;Initial Catalog=MyInventory;Integrated Security=True" SettingsObjectName="ConsoleApplication16.Properties.Settings" SettingsPropertyName="MyInventoryConnectionString" Provider="System.Data.SqlClient" />
  <Function Name="dbo.GetUserData" Method="GetUserData">
    <Parameter Name="UserId" Parameter="userId" Type="System.Int64" DbType="BigInt" />
    <ElementType Name="GetUserDataResult">
      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
      <Column Name="Name" Type="System.String" DbType="VarChar(50) NOT NULL" CanBeNull="false" />
      <Column Name="Email" Type="System.String" DbType="NVarChar(50)" CanBeNull="true" />
      <Column Name="IsDeleted" Type="System.Boolean" DbType="Bit NOT NULL" CanBeNull="false" />
      <Column Name="HomePage" Type="System.String" DbType="VarChar(100)" CanBeNull="true" />
    </ElementType>
  </Function>
</Database>
[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.GetAll")]
[global::System.Data.Linq.Mapping.ResultTypeAttribute(typeof(GetAllResult))]
[global::System.Data.Linq.Mapping.ResultTypeAttribute(typeof(GetAllResult1))]
public IMultipleResults GetAll()
{
   IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
   return ((IMultipleResults)(result.ReturnValue));
}
public partial class DataBaseDataContext
{
    [ResultType(typeof(FirstResult))]
    [ResultType(typeof(SecondResult))]
    [Function(Name = "dbo.StoredProc")]
    public IMultipleResults StoredProc([global::System.Data.Linq.Mapping.ParameterAttribute(DbType = "Int")] System.Nullable<System.Int> ID)
    {
        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), ID);
        return ((IMultipleResults)(result.ReturnValue));
    }
}

public class FirstResult;

public class SecondResult;

我可以清楚地看到,只创建了一个用户记录集,它缺少角色模式:(

有谁能告诉我这是什么,为什么

谢谢
Lura

你看过为你的模型生成的代码了吗?这里会有两个结果集。映射可能存在


Ramesh

我的发现是,如果您手动将结果集添加到dbml中,您将获得所需的结果,但LinqToSql并没有为您提供访问这些结果的简单方法

这是一条通向您的结果的路径

((System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReaderSession
    <System.Data.SqlClient.SqlDataReader>)
   (((System.Data.Linq.SqlClient.SqlProvider.ExecuteResult)(result)).session)).buffer
生成的cs文件如下所示

<?xml version="1.0" encoding="utf-8"?>
<Database Name="MyInventory" Class="MyDBMLDataContext" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
  <Connection Mode="AppSettings" ConnectionString="Data Source=MyDatabaseServer\;Initial Catalog=MyInventory;Integrated Security=True" SettingsObjectName="ConsoleApplication16.Properties.Settings" SettingsPropertyName="MyInventoryConnectionString" Provider="System.Data.SqlClient" />
  <Function Name="dbo.GetUserData" Method="GetUserData">
    <Parameter Name="UserId" Parameter="userId" Type="System.Int64" DbType="BigInt" />
    <ElementType Name="GetUserDataResult">
      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
      <Column Name="Name" Type="System.String" DbType="VarChar(50) NOT NULL" CanBeNull="false" />
      <Column Name="Email" Type="System.String" DbType="NVarChar(50)" CanBeNull="true" />
      <Column Name="IsDeleted" Type="System.Boolean" DbType="Bit NOT NULL" CanBeNull="false" />
      <Column Name="HomePage" Type="System.String" DbType="VarChar(100)" CanBeNull="true" />
    </ElementType>
  </Function>
</Database>
[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.GetAll")]
[global::System.Data.Linq.Mapping.ResultTypeAttribute(typeof(GetAllResult))]
[global::System.Data.Linq.Mapping.ResultTypeAttribute(typeof(GetAllResult1))]
public IMultipleResults GetAll()
{
   IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
   return ((IMultipleResults)(result.ReturnValue));
}
public partial class DataBaseDataContext
{
    [ResultType(typeof(FirstResult))]
    [ResultType(typeof(SecondResult))]
    [Function(Name = "dbo.StoredProc")]
    public IMultipleResults StoredProc([global::System.Data.Linq.Mapping.ParameterAttribute(DbType = "Int")] System.Nullable<System.Int> ID)
    {
        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), ID);
        return ((IMultipleResults)(result.ReturnValue));
    }
}

public class FirstResult;

public class SecondResult;

在从一个网站的数据库中获取多个数据集时,我必须处理类似的问题。我们所做的是创建一个DatabaseExtensions.cs文件,以添加具有多个数据集的查询

所以在扩展名文件中,我们会有如下内容

<?xml version="1.0" encoding="utf-8"?>
<Database Name="MyInventory" Class="MyDBMLDataContext" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
  <Connection Mode="AppSettings" ConnectionString="Data Source=MyDatabaseServer\;Initial Catalog=MyInventory;Integrated Security=True" SettingsObjectName="ConsoleApplication16.Properties.Settings" SettingsPropertyName="MyInventoryConnectionString" Provider="System.Data.SqlClient" />
  <Function Name="dbo.GetUserData" Method="GetUserData">
    <Parameter Name="UserId" Parameter="userId" Type="System.Int64" DbType="BigInt" />
    <ElementType Name="GetUserDataResult">
      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
      <Column Name="Name" Type="System.String" DbType="VarChar(50) NOT NULL" CanBeNull="false" />
      <Column Name="Email" Type="System.String" DbType="NVarChar(50)" CanBeNull="true" />
      <Column Name="IsDeleted" Type="System.Boolean" DbType="Bit NOT NULL" CanBeNull="false" />
      <Column Name="HomePage" Type="System.String" DbType="VarChar(100)" CanBeNull="true" />
    </ElementType>
  </Function>
</Database>
[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.GetAll")]
[global::System.Data.Linq.Mapping.ResultTypeAttribute(typeof(GetAllResult))]
[global::System.Data.Linq.Mapping.ResultTypeAttribute(typeof(GetAllResult1))]
public IMultipleResults GetAll()
{
   IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
   return ((IMultipleResults)(result.ReturnValue));
}
public partial class DataBaseDataContext
{
    [ResultType(typeof(FirstResult))]
    [ResultType(typeof(SecondResult))]
    [Function(Name = "dbo.StoredProc")]
    public IMultipleResults StoredProc([global::System.Data.Linq.Mapping.ParameterAttribute(DbType = "Int")] System.Nullable<System.Int> ID)
    {
        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), ID);
        return ((IMultipleResults)(result.ReturnValue));
    }
}

public class FirstResult;

public class SecondResult;
公共部分类DataBaseDataContext
{
[ResultType(typeof(FirstResult))]
[ResultType(typeof(SecondResult))]
[函数(Name=“dbo.StoredProc”)]
公共IMultipleResults StoredProc([global::System.Data.Linq.Mapping.ParameterAttribute(DbType=“Int”)]System.Nullable ID)
{
IExecuteResult=this.ExecuteMethodCall(this,((MethodInfo)(MethodInfo.GetCurrentMethod()),ID);
返回((IMultipleResults)(result.ReturnValue));
}
}
公开课成绩第一;
公开课成绩;
注意:为了便于阅读,我更改了代码中的一些名称,因此可能无法正常工作

FirstResult和SecondResult是结果类型类。我通常会从dbml附带的.cs文件中复制它们,然后重命名它。我没有在这里包含它们的代码,因为它们可能会很长

DataBaseDataContext dataCon = new DataBaseDataContext();
var results = dataCon.StoredProc(id);
var firstSet = results.GetResult<FirstResult>();
var secondSet = results.GetResult<SecondResult>();
//process data
DataBaseDataContext dataCon=newdatabasedatacontext();
var结果=dataCon.StoredProc(id);
var firstSet=results.GetResult();
var secondSet=results.GetResult();
//过程数据

按照存储过程中显示结果的顺序显示结果是很重要的。在显示结果后,您可以使用LINQ或其他任何工具来处理它们。

我希望我能开始对这一问题进行悬赏,以获得最大的答案