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