将数据集动态映射到StringTemplate
问题描述:
我在Windows服务通知项目(.NET 4.0)中使用StringTemplate。我的目标是读入并处理定义查询和字符串模板的XML文件。该类然后将来自DataTable的结果绑定到用于发送电子邮件的模板中。下面是一个XML片段,LINQ语句和C#来完成绑定。将数据集动态映射到StringTemplate
<!-- 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,但解决方案不必。
答
我采取的方法是不投影到匿名类型和迭代集合的字符串模板文件中。我也以同样的方式处理单个记录“静态”,但是我在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$
}$
在你在你的答案有模板;你没有剩下的问题中的xml。在你的实际模板中;是XML还在那里,还是你使用字符串模板生成消息,然后手动插入到您的XML使用DOM操纵...或类似的东西? – Dave 2011-04-09 22:33:05