Отсутствует схема в DBML, если LINQ to SP и Sp возвращают несколько наборов записей - PullRequest
3 голосов
/ 29 декабря 2010

при создании POC LINQ to SQL и сущностей я столкнулся с проблемой, застрявшей в тупике. Проблема в том, что я использую LINQ to 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

затем я уронил этот SP в моем DBML (классы Linq to SQL), тогда я заметил, что только схема из одного набора записей была создана, как это

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

Я ясно вижу, что из записей пользователей создан только один набор записей, но отсутствует схема роли: (.

Может ли кто-нибудь сказать мне, что и почему это так?

Спасибо Lura

Ответы [ 3 ]

2 голосов
/ 30 декабря 2010

Мне приходилось сталкиваться с чем-то похожим в получении нескольких наборов данных из базы данных для веб-сайта.Мы создали файл 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 являются классами типа результата.Я обычно копировал бы их из сопровождающего файла .cs dbml, а затем переименовывал его.Я не включил их код здесь, потому что он может быть довольно длинным.

DataBaseDataContext dataCon = new DataBaseDataContext();
var results = dataCon.StoredProc(id);
var firstSet = results.GetResult<FirstResult>();
var secondSet = results.GetResult<SecondResult>();
//process data

Важно выводить результаты в том же порядке, в каком они появляются в вашей хранимой процедуре.После того, как вы получили свои результаты, вы можете использовать LINQ или что-то еще для работы с ними.

0 голосов
/ 30 декабря 2010

Мой вывод заключается в том, что если вы вручную добавляете набор результатов в ваш dbml, вы получаете нужные результаты, но LinqToSql не предлагает вам простой способ получить к ним доступ

Вот путь кваши результаты

((System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReaderSession
    <System.Data.SqlClient.SqlDataReader>)
   (((System.Data.Linq.SqlClient.SqlProvider.ExecuteResult)(result)).session)).buffer

у вас есть доступ к вашему результату по индексу buffer[0], который вернет результаты вашего первого оператора выбора, а buffer[1] вернет результат второго выбора.вероятно, вы можете привести эти два IEnumerable к набранным IEnumerable<GetAllResult> и IEnumerable<GetAllResult1>, хотя я этого не проверял.

Я строю этот пример dbml

<Function Name="dbo.GetAll" Method="GetAll">
    <ElementType Name="GetAllResult">
      <Column Name="ID" Type="System.Int32" DbType="Int" CanBeNull="true" />
      <Column Name="Tagname" Type="System.String" DbType="NChar(10)" CanBeNull="true" />
    </ElementType>
    <ElementType Name="GetAllResult1">
      <Column Name="Id" Type="System.Int32" DbType="Int" CanBeNull="true" />
      <Column Name="TagId" Type="System.Int32" DbType="Int" CanBeNull="true" />
      <Column Name="Name1" Type="System.String" DbType="NChar(10)" CanBeNull="true" />
    </ElementType>
  </Function>

и сгенерированныйФайл CS будет выглядеть так:

[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));
}
0 голосов
/ 30 декабря 2010

Вы смотрели код, сгенерированный для вашей модели? Два набора результатов будут здесь. Картография может лгать.

Рамеш

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...