代码之家  ›  专栏  ›  技术社区  ›  IsmailS

StoredProcedure使用设计器将多个结果集SQL返回到Linq

  •  1
  • IsmailS  · 技术社区  · 14 年前

    我想使用sql to linq从storedproc获取多个结果集。我无法从设计器生成它,所以我在designer.cs文件中编写了以下代码。但每当我向Designer添加某些内容时,它都会使用.dbml文件中的标记刷新Designer,因此每次添加内容时都会删除下面的代码。我每次都要复制它。如果我能为此得到相应的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));
    }
    

    I've already defined Module and ModuleOption as tables. 现在,当我在.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 回复  |  直到 14 年前
        1
  •  0
  •   Peter Willis    14 年前

    将方法添加到数据上下文的分部类中。

    您可以通过在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));
        }   
    }
    
        2
  •  0
  •   IsmailS    14 年前

    我自己回答。

    不能为存储过程的结果集使用已定义的类型。所以我不得不将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. include.dbml和.dbml.layout文件(这将再次生成.designer.cs文件,但不会将其包含在项目中)。
    5. 在项目中包含.designer文件。
    6. 获取模块类型和模块操作类型的列表,如下所示。


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

    更新
    还是个更好的方法。 右键单击解决方案资源管理器中的DBML文件,然后选择“打开方式”。选择 XML Editor 当您在Visual Studio中保存该文件时,它会自动生成designer.cs文件。