0

最初に、私はASP.NET(ただし、C#の経験があります)とEntityFrameworkを初めて使用することに注意する必要があります。私は学校のプロジェクトに取り組んでいますが、エネルギー消費データを含む非常に複雑なデータベースがあります。必要なもの(Iインポート、Eエクスポート、無効電力CなどL)は、バイナリ圧縮として1つの列に格納されるため、それらを取得するには、カスタムアセンブリのいくつかのメソッドを呼び出して列を解凍し、データを復元するストアドプロシージャを使用する必要があります。

ストアドプロシージャには4つの引数があります。

@identify int,
@startTime datetime,
@endTime datetime,
@args nvarchar(60) -- "Selector"

これselectorはかなり特殊な引数であり、結果セットに必要なものを指定します。たとえば'i'、[インポート]列のみ、 ['i,e'インポート]および[エクスポート]の場合です。すべての列ではなく1つの列だけが必要な場合は(圧縮データの保存方法のため)高速であるため、このように設計されています。

そこで、と呼ばれるADO.NETエンティティモデルを作成しEnergyConsumptionDBModel、ストアドプロシージャをインポートして、EnergyConsumptionResult次のようにストアドプロシージャの戻り型の複合型を作成しました。

public partial class EnergyConsumptionResult
{
    public System.DateTime Time { get; set; }
    public double I { get; set; }
    public double E { get; set; }
    public double L { get; set; }
    public double C { get; set; }
}

Timeは常に結果セットに存在しますが、残りは@argsストアドプロシージャの引数によって異なります。たとえば'i,e,c,l'、引数として選択すると、列が返されTime, I, E, C, L、すべてが正常に実行されますが、たとえば、選択すると、例外が'i'返されます。Time, I

データリーダーは、指定された「EnergyConsumptionDBModel.EnergyConsumptionResult」と互換性がありません。
タイプ'E'のメンバーには、同じ名前の対応する列がデータリーダーにありません。

だから問題は、これを解決する簡単な方法はありますか?複合型でのある種の動的な結果マッピング、またはストアドプロシージャを設計した同僚に、すべての列を返すように指示するのははるかに簡単です@argsが、未使用の列は空のままにします。これは、プロジェクトリーダーが解決できない可能性がある解決策です。お気に入り。助けてくれてありがとう。

4

1 に答える 1

2

EFの列数が可変の結果セットを自動的にマップすることはできないと思います。設計時にマッピングを指定すると、EFはそれに依存します。できることは、すべての列を返すことですが、データを返さない列をnullに設定します。ストアドプロシージャを直接実行して、ObjectContext(http://msdn.microsoft.com/en-us/library/dd466384.aspx)のTranslateメソッドを使用して具体化することもできますが、このメソッドでもリーダーの列が必要になると思います。プロパティ名に対応します。

于 2012-10-22T20:26:11.193 に答える