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 获取数据并将其绑定到我的字符串模板?注意我目前正在使用 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 回答