Динамическое сопоставление набора данных с StringTemplate - PullRequest
0 голосов
/ 06 марта 2011

Я использую StringTemplate в проекте уведомлений службы Windows (.NET 4.0).Моя цель - читать и обрабатывать 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, но решение не требуется.

1 Ответ

1 голос
/ 10 марта 2011

Подход, который я выбрал, заключается не в проецировании на анонимный тип, а в файл шаблона String итерации по коллекции. Я также рассматриваю одну и ту же запись как статическую, но я использую фильтр FirstOrDefault в операторе Linq.

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$
}$
...