0

Windows サービス通知プロジェクト (.NET 4.0) でStringTemplateを使用しています。私の目的は、クエリと文字列テンプレートを定義する XML ファイルを読み込んで処理することです。次に、このクラスは、DataTable からの結果を電子メール送信用のテンプレートにバインドします。以下は、XML スニペットと、バインディングを行うための LINQ ステートメントと C# です。

<!-- XML Data Original-->
<Items>
  <Item>
    <Query>
       Select name, title, date from People;
    </Query>
    <Template>
        Welcome $name to $title$ on $date$.
    </Template>
  </Item>
</Items>

 var dataTable = database.GetQuery(query);
 var data = (from dataRow in dataTable.AsEnumerable()
            select new
            {
               Name = dataRow.Field<string>("Name"),
               Title = dataRow.Field<string>("Title"),
               Date = dataRow.Field<DateTime>("Date")
            }).Distinct();
  stringTemplate.SetAttribute("Name", data.Name);
  stringTemplate.SetAttribute("Title", data.Title);
  stringTemplate.SetAttribute("Date", data.Date);

問題は、上記の C# が静的であることです。動的にしたいと考えています。XML クエリ要素に別のフィールドと対応するテンプレート フィールドを追加する必要がある場合はどうすればよいでしょうか。

<!-- XML Data Modified-->
<Items>
  <Item>
    <Query>
       Select name, title, date, location from People;
    </Query>
    <Template>
        Welcome $name to $title$ on $date$ at $location$.
    </Template>
  </Item>
</Items>

DataTable には新しい列が含まれていますが、LINQ ステートメントとバインディング コードには含まれていません。私の質問は、データを DataTable から取得して stringtemplate に動的にバインドするためにどのような戦略を採用できるかということです。現在LINQを使用していますが、ソリューションはそうである必要はありません。

4

1 に答える 1

1

私が取ったアプローチは、匿名型に射影するのではなく、コレクションを反復処理する文字列テンプレート ファイルに射影することではありません。単一のレコード「静的」も同じ方法で扱いますが、Linq ステートメントで FirstOrDefault フィルターを使用します。

C#:

var dataTable = database.GetQuery(query);
var data = (from dataRow in dataTable.AsEnumerable()
            select dataRow);
stringTemplate.SetAttribute("dynamic", data);

テンプレート:

$dynamic:{ d |
Welcome $d.name$ to $d.title$ on $d.date$ at $d.location$
}$
于 2011-03-10T14:40:38.283 に答える