2009-08-16 10 views
1

私のプロジェクトのレポートエンジンを設計しています。プロジェクトにはいくつかのレポートがあり、それぞれのレポートはLinqクエリとして表現できます。あるものはパラメータを持ち、他のものはそうしない。Linqレポートを処理して結果をXMLで返す一般的な方法をお探しください

クライアントの要件を満たすために、クエリの結果をXML形式で返す必要があるため、XSLトランスフォームを適用して自分の好みに合ったものにすることができます。

これまでの計画では、すべてのレポートが作成される抽象的なReport基本クラスを使用しています。基底クラスは次のメソッドが必要になります。

public virtual void SetParameter(string ParameterName, object Value) { 
    throw new NotImplementedException("This report does not accept parameters."); 
} 

public abstract object GetData(); // what return type? 

public XElement GetXMLData() { 
    // calls GetData() and uses some kind of reflection to turn the data into XML? 
} 

もう少しこれを肉付けするには:SetParameter()かなり自明です。 GetData()にはLinqクエリが含まれ、IEnumerable<'a>タイプが返されます。ここで'aは最終結果の匿名タイプです。しかし、明らかに何かを匿名型として宣言することはできないので、Linqクエリの結果に関連する他の一般的な方法が必要です。返されたフィールドを反復して適切なXMLスキーマを作成することができます。

GetData()の返品タイプはどうすればよいですか?フィールド名/値を取得するにはどうすればよいですか?あるいは、私の目的を達成するためのよりよい方法がありますか?

+0

データは表形式ですか、またはリターンにも子コレクションがありますか? –

+0

リターンの子コレクションである可能性があります。私のコードは、すべてのコレクションを(再帰的に)処理し、「プリミティブ」型のプロパティをXMLに変換する必要があります。 –

答えて

1

データはSQLサーバーに保存されていますか?

なぜSQL Server Reporting Servicesを使用しないのですか?それはSQL Serverで "フリー"になります。レポートエンジンを最初から構築するよりも生産性が向上します。

+0

これは、あなたが大胆ではない、限られた設計能力、pdfエンジンは編集不可能な形式でPDFを保存することを許さず、外部の顧客は自分のルック・アンド・フィールを書いたりデザインすることができず、レポート... –

1

目的のレポートタイプを目的のデータタイプに対して汎用にすることはできますか?

public class ReportBase<TEntity> { 
    public virtual void SetParameter<T>(string ParameterName, T Value) { 
     throw new NotImplementedException("This report does not accept parameters."); 
    } 

    public abstract TEntity GetData(); 

    public XElement GetXmlData() { 
     // calls GetData() and uses some kind of reflection to turn the data into XML? 
    } 
} 

またGetXmlDataを簡素化し、自分自身をシリアライズする方法を公開して、いくつかの基本型であることがTEntityを制限することができます。 .NETのビルトインXMLシリアル化機能の使用を検討しましたか?

関連する問題