Frage

Ich möchte mehrere Resultsets aus einer StoredProc mithilfe von SQL zu Linq bekommen. Ich war nicht in der Lage, es von Designern zu erzeugen, so ich unter Code in designer.cs Datei geschrieben. Aber immer, wenn ich etwas zu Designern hinzufügen, erfrischt es den Designer mit dem Markup in .dbml Datei und damit entfernt sie den folgenden Code jedes Mal, wenn ich etwas hinzufügen. Ich habe es jedes Mal zu kopieren. Wenn ich DBML Markup für entsprechend diese bekommen kann, wäre es toll.

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

Ich habe bereits Module und ModuleOption als Tabellen definiert. Nun, wenn ich unter Markup in .dbml Datei hinzufügen, es klagt 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>

Ich bin mit Visual Studio 2008 SP1

War es hilfreich?

Lösung 2

Ich bin meine eigene Antwort zu antworten.
Man kann nicht die bereits definierte Art für Ergebnismenge der gespeicherten Prozedur verwenden. So hatte ich den Namen von Element zu ModuleResult und ModuleOptionResult zu ändern.

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

Hier sind die Schritte, die ich das obige Problem zu lösen hat.

  1. Löschen Sie die designer.cs Datei
  2. Fügen Sie oben Markup auf die .dbml Datei
  3. ausschließen .dbml und .dbml.layout Datei
  4. Fügen Sie .dbml und .dbml.layout Datei (dies wird erzeugen designer.cs Datei erneut aber es nicht in dem Projekt).
  5. Neue .designer Datei in Projekt.
  6. Holen Sie die Liste der Modultyp und ModuleOption Typ wie unten.


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
immer noch eine bessere Art und Weise. Rechtsklick auf die Datei dbml in Lösung Explorer und wählen Sie Öffnen mit. Wählen Sie XML Editor und wenn Sie speichern die Datei in Visual Studio erzeugt sie automatisch die designer.cs Datei.

Andere Tipps

Fügen Sie das Verfahren zur Teilklasse für den Datenkontext.

Sie dies erreichen, indem eine Datei mit dem gleichen Namen wie der Datenkontext neben der dbml-Datei hinzufügen, und verwenden Sie die Klassendeklaration:

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));
    }   
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top