Question

Je veux obtenir plusieurs resultsets d'un storedproc en utilisant sql à LINQ. Je n'étais pas en mesure de générer du concepteur donc je l'ai écrit ci-dessous le code dans designer.cs fichier. Mais chaque fois que j'ajouter quelque chose à concepteur, il rafraîchit le concepteur avec le balisage dans le fichier .dbml et par conséquent, il supprime le ci-dessous le code chaque fois que j'ajouter quelque chose. Je dois le copier chaque fois. Si je peux obtenir correspondant dbml balisage pour cela, ce serait génial.

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

Je l'ai déjà défini Module et ModuleOption sous forme de tableaux. Maintenant, quand j'AJOUTZ balisage dans .dbml fichier, il se plaint 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>

J'utilise Visual Studio 2008 SP1

Était-ce utile?

La solution 2

Je répondant ma propre réponse.
On ne peut pas utiliser le type déjà défini pour le jeu de résultats de la procédure stockée. Donc, je devais changer le nom de ElementType à ModuleResult et 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>

Voici les étapes que je pris pour résoudre le problème ci-dessus.

  1. Supprimer le fichier .designer.cs
  2. Ajouter au-dessus des balises pour le fichier .dbml
  3. Exclure .dbml et .dbml.layout fichier
  4. Inclure .dbml et (cela va générer à nouveau fichier .designer.cs mais ne l'inclure dans le projet) fichier .dbml.layout.
  5. Inclure .designer fichier dans le projet.
  6. Obtenir la liste de type module et le type ModuleOption comme ci-dessous.

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 Encore un bien meilleur. Clic droit sur le fichier dbml dans l'explorateur de solution et sélectionnez Ouvrir avec. Choisissez XML Editor et lorsque vous enregistrez le fichier au sein du studio visuel, il génère automatiquement le fichier designer.cs.

Autres conseils

Ajoutez la méthode à la classe partielle pour le contexte de données.

Vous y parvenir en ajoutant un fichier avec le même nom que le contexte de données avec le fichier dbml et utilisez la déclaration de classe:

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));
    }   
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top