Procedimiento almacenado devolver conjunto de resultados múltiples utilizando SQL para LINQ diseñador

StackOverflow https://stackoverflow.com/questions/3099657

Pregunta

Quiero tener varios conjuntos de resultados desde un storedproc utilizando SQL para LINQ. Yo no era capaz de generarlo a partir diseñador así que escribí a continuación el código en el archivo de designer.cs. Pero cada vez que añadir algo que el diseñador, que refresca el diseño con el marcado en el archivo .dbml y por lo tanto elimina el siguiente código cada vez que añadir algo. Tengo que copiar cada vez. Si puedo conseguir que corresponde dbml marcado para esto, sería muy bueno.

[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));
}

Ya he definido módulo y ModuleOption como tablas. Ahora cuando agrego a continuación marcado en .dbml archivo se queja 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>

Estoy usando Visual Studio 2008 SP1

¿Fue útil?

Solución 2

Estoy respondiendo mi propia respuesta.
No se puede utilizar el tipo ya definido para conjunto de resultados de procedimiento almacenado. Así que tuve que cambiar el nombre de ElementType a ModuleResult y 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>

Estos son los pasos que tomé para resolver el problema anterior.

  1. Eliminar el archivo .designer.cs
  2. Añadir por encima de marcadores para el archivo .dbml
  3. Excluir .dbml y .dbml.layout archivo
  4. Incluir .dbml y .dbml.layout archivo (esto generará un archivo nuevo .designer.cs pero no lo incluirán en el proyecto).
  5. Incluir .designer archivo en proyecto.
  6. Obtener la lista de Tipo de módulo y el tipo ModuleOption como a continuación.


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
                    };

Actualizar
Todavía una mejor manera. Haga clic derecho en el archivo dbml en el Explorador de soluciones y seleccione Abrir con. Elija XML Editor y cuando se guarda el archivo dentro de Visual Studio genera automáticamente el archivo designer.cs.

Otros consejos

Añadir el método a la clase parcial para el contexto de datos.

Esto se consigue mediante la adición de un archivo con el mismo nombre que el contexto de datos junto con el archivo dbml, y el uso de la declaración de clase:

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));
    }   
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top