动态地将DataSet映射到StringTemplate

时间:2011-03-06 13:35:30

标签: c# xml linq datatable stringtemplate

我在Windows服务通知项目(.NET 4.0)中使用StringTemplate。我的目标是读入并处理定义查询和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,但解决方案不需要。

1 个答案:

答案 0 :(得分:1)

我采用的方法不是投射到匿名类型和迭代集合的字符串模板文件中。我也以同样的方式处理单个记录“static”,但我在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$
}$