StoredProcedure, возвращающий несколько результатов Sql To Linq с помощью конструктора - PullRequest
1 голос
/ 23 июня 2010

Я хочу получить несколько наборов результатов из хранимых процессов, используя sql для linq. Я не смог сгенерировать его из конструктора, поэтому я написал код ниже в файле designer.cs. Но всякий раз, когда я добавляю что-то в конструктор, он обновляет конструктор разметкой в ​​файле .dbml и, следовательно, удаляет приведенный ниже код каждый раз, когда я что-то добавляю. Я должен копировать это каждый раз. Если бы я мог получить соответствующую разметку DBML для этого, было бы здорово.

[Function(Name = "dbo.GetAllModulesAndOptions")]
[ResultType(typeof(Module))]
[ResultType(typeof(ModuleOption))]
public IMultipleResults GetAllModules()
{
  IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
  return ((IMultipleResults)(result.ReturnValue));
}

Я уже определил Module и ModuleOption в виде таблиц. Теперь, когда я добавляю разметку ниже в файл .dbml, он жалуется DBML1114: The Name attribute 'Module' of the Type element is already used by another type.

  <Function Name="dbo.GetAllModulesAndOptions" Method="GetAllModules">
    <ElementType Name="Module">
      <Column Name="ModuleId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
      <Column Name="ModuleName" Type="System.String" DbType="VarChar(50)" CanBeNull="true" />
      <Column Name="Description" Type="System.String" DbType="VarChar(255)" CanBeNull="true" />
      <Column Name="SalesDesc" Type="System.String" DbType="VarChar(MAX)" CanBeNull="true" />
      <Column Name="ParentModuleId" Type="System.Int32" DbType="Int" CanBeNull="true" />
    </ElementType>
    <ElementType Name="ModuleOption">
      <Column Name="ModuleOptionId" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
      <Column Name="ModuleOptionName" Type="System.String" DbType="VarChar(50)" CanBeNull="true" />
      <Column Name="ModuleOptionDesc" Type="System.String" DbType="VarChar(MAX)" CanBeNull="true" />
      <Column Name="DefaultPrice" Type="System.Decimal" DbType="Money" CanBeNull="true" />
      <Column Name="ModuleId" Type="System.Int64" DbType="BigInt" CanBeNull="true" />
      <Column Name="InUse" Type="System.Int32" DbType="Int" CanBeNull="true" />
    </ElementType>
  </Function>

Я использую Visual Studio 2008 SP1

Ответы [ 2 ]

0 голосов
/ 24 июня 2010

Я отвечаю своим собственным ответом.

Нельзя использовать уже определенный тип для набора результатов хранимой процедуры. Поэтому мне пришлось изменить имя ElementType на ModuleResult и ModuleOptionResult.

  <Function Name="dbo.GetAllModulesAndOptions" Method="GetAllModules">
    <ElementType Name="ModuleResult">
      <Column Name="ModuleId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
      <Column Name="ModuleName" Type="System.String" DbType="VarChar(50)" CanBeNull="true" />
      <Column Name="Description" Type="System.String" DbType="VarChar(255)" CanBeNull="true" />
      <Column Name="SalesDesc" Type="System.String" DbType="VarChar(MAX)" CanBeNull="true" />
      <Column Name="ParentModuleId" Type="System.Int32" DbType="Int" CanBeNull="true" />
    </ElementType>
    <ElementType Name="ModuleOptionResult">
      <Column Name="ModuleOptionId" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
      <Column Name="ModuleOptionName" Type="System.String" DbType="VarChar(50)" CanBeNull="true" />
      <Column Name="ModuleOptionDesc" Type="System.String" DbType="VarChar(MAX)" CanBeNull="true" />
      <Column Name="DefaultPrice" Type="System.Decimal" DbType="Money" CanBeNull="true" />
      <Column Name="ModuleId" Type="System.Int64" DbType="BigInt" CanBeNull="true" />
      <Column Name="InUse" Type="System.Int32" DbType="Int" CanBeNull="true" />
    </ElementType>
  </Function>

Вот шаги, которые я предпринял для решения вышеуказанной проблемы.

  1. Удалить файл .designer.cs
  2. Добавить указанную выше разметку в файл .dbml
  3. Исключить файлы .dbml и .dbml.layout
  4. Включить файлы .dbml и .dbml.layout (это снова создаст файл .designer.cs, но не включит его в проект).
  5. Включить файл .designer в проект.
  6. Получите список типов модулей и типов ModuleOption, как показано ниже.

1020 *
*

var modules = from row in results.GetResult<ModuleResult>().ToList()
                       select new Module
                                {
                                  ModuleId = row.ModuleId,
                                  ModuleName = row.ModuleName,
                                  Description = row.Description,
                                  SalesDesc = row.SalesDesc,
                                  ParentModuleId = row.ParentModuleId
                                };

var moduleOptions = from row in results.GetResult<ModuleOptionResult>().ToList()
                    select new ModuleOption
                    {
                      ModuleOptionId = row.ModuleOptionId,
                      ModuleOptionName = row.ModuleOptionName,
                      ModuleOptionDesc = row.ModuleOptionDesc,
                      DefaultPrice = row.DefaultPrice,
                      ModuleId = row.ModuleId,
                      InUse = row.InUse
                    };

UPDATE
Еще лучший способ. Щелкните правой кнопкой мыши файл dbml в обозревателе решений и выберите открыть с помощью. Выберите XML Editor, и когда вы сохраните файл в Visual Studio, он автоматически создаст файл designer.cs.

0 голосов
/ 23 июня 2010

Добавьте метод в частичный класс для контекста данных.

Вы достигаете этого, добавляя файл с тем же именем, что и контекст данных, вместе с файлом dbml и используете объявление класса:

public partial class YourDataContext
{
    [Function(Name = "dbo.GetAllModulesAndOptions")]
    [ResultType(typeof(Module))]
    [ResultType(typeof(ModuleOption))]
    public IMultipleResults GetAllModules()
    {
        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo (MethodInfo.GetCurrentMethod())));
        return ((IMultipleResults)(result.ReturnValue));
    }   
}
...