保存されているプローディアは、デザイナーを使用して複数の結果をRINQに戻します
-
29-09-2019 - |
質問
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));
}
モジュールとモジュールオプションをテーブルとして定義しています。今、私が.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
私は自分の答えに返信しています。
既に定義されているタイプを、ストアドプロシージャの結果セットに使用することはできません。そのため、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>
上記の問題を解決するために行った手順を次に示します。
- .designer.csファイルを削除します
- .dbmlファイルに上記のマークアップを追加します
- .dbmlおよび.dbml.layoutファイルを除外します
- .dbmlと.dbml.layoutファイルを含める(これにより.designer.csファイルが再び生成されますが、プロジェクトには含まれません)。
- プロジェクトに.Designerファイルを含めます。
- 以下のように、モジュールタイプとモジュールオプションタイプのリストを取得します。
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ファイルが自動的に生成されます。
他のヒント
データコンテキストの部分クラスにメソッドを追加します。
これは、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));
}
}