gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:35:52 25 4
gpt4 key购买 nike

在制作 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com