2011-03-06 103 views
0

我在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,但解决方案不必。

回答

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$ 
}$ 
+0

在你在你的答案有模板;你没有剩下的问题中的xml。在你的实际模板中;是XML还在那里,还是你使用字符串模板生成消息,然后手动插入到您的XML使用DOM操纵...或类似的东西? – Dave 2011-04-09 22:33:05