linq - 如果使用 LINQ to SP 和 Sp 返回多个记录集,DBML 中缺少模式

标签 linq linq-to-sql linq-to-entities

在制作 LINQ to SQL 和实体的 POC 时,我遇到了一个卡在死胡同里的问题。 问题是,我正在使用 LINQ to SP,一切都运行良好,我制作了很酷的编辑、添加和删除方法。然后在我的矿井中点击了一些东西,“如果我只是从 SP 返回两个记录集怎么办”。我制作了一个 SP 并从中返回了两个记录集

SP 看起来像这样 [Demo]

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 to 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>

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

谁能告诉我这是什么以及为什么会这样?

谢谢 卢拉

最佳答案

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

所以在扩展文件中我们会有这样的东西

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;

注意:为了便于阅读,我更改了这段代码中一些东西的名称,因此它可能无法按原样运行。

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

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

关于linq - 如果使用 LINQ to SP 和 Sp 返回多个记录集,DBML 中缺少模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4554123/

相关文章:

c# - 分组 2 个表,计算值,然后将结果保存在字典中

linq-to-sql - 为什么 OR 设计师不让我将表格拖动到设计表面?

c# - 优化还是放弃 LINQ 查询?

c# - Linq 到实体。空引用异常

LINQ Any 与 Exists 性能对比

c# - 使用 LINQ 在 C# 中将值和范围绑定(bind)到下拉列表

c# - 如何计算 JObject 中有多少个使用 LINQ 设置的字段?

c# - MVC 在 C# 中连接多个 2 个表并根据结果填充列表

sql - 如何在 Linq to Sql 的子查询中选择 MAX

c# - 如何使用 Entity Framework 获取单值