Ищете общий способ обработки отчетов Linq и возврата результатов в XML

Я разрабатываю механизм отчетности для своего проекта. В проекте будет несколько отчетов, каждый из которых может быть выражен в виде запроса Linq; у некоторых будут параметры, а у других нет.

Теперь, чтобы удовлетворить требования моих клиентов, мне нужно возвращать результаты запросов в формате XML, чтобы они могли применить преобразование XSL, чтобы они выглядели красиво в соответствии с их собственным вкусом.

Итак, мой план на данный момент состоит в том, чтобы иметь абстрактный Report базовый класс, из которого будут производиться все мои отчеты. Базовому классу потребуются следующие методы:

public virtual void SetParameter(string ParameterName, object Value) {
  throw new NotImplementedException("This report does not accept parameters.");
}

public abstract object GetData(); // what return type?

public XElement GetXMLData() {
  // calls GetData() and uses some kind of reflection to turn the data into XML?
}

Чтобы конкретизировать это немного больше: SetParameter() довольно очевиден. Предполагается, что GetData() содержит запрос Linq и возвращает тип IEnumerable<'a>, где 'a — анонимный тип конечного результата. Но, очевидно, вы не можете объявить что-то анонимным, поэтому мне нужен какой-то другой общий способ связи с результатами моего запроса Linq, который позволит мне перебирать возвращаемые поля и создавать соответствующую XML-схему.

Каким должен быть возвращаемый тип GetData()? Как получить имена/значения полей? В качестве альтернативы, есть ли лучший способ достичь моей цели?


person Shaul Behr    schedule 16.08.2009    source источник
comment
Данные представлены в табличном формате или в возврате также есть дочерние коллекции?   -  person Nick Craver    schedule 16.08.2009
comment
В возврате могут быть дочерние коллекции. Мой код должен работать (рекурсивно?) со всеми коллекциями и преобразовывать свойства примитивного типа в XML.   -  person Shaul Behr    schedule 16.08.2009


Ответы (2)


Ваши данные хранятся на сервере SQL?

Если да, то почему бы не использовать службы отчетов SQL Server? Он поставляется «бесплатно» с SQL Server. Это было бы гораздо более продуктивно, чем создание механизма отчетов с нуля.

person Shiraz Bhaiji    schedule 16.08.2009
comment
Из-за того, что это медленно, вы не можете смело, ограниченные возможности дизайна, механизм PDF не позволяет вам сохранять PDF в нередактируемом формате, внешние клиенты не могут писать и разрабатывать свой собственный внешний вид, клиенты не могут писать свой собственный SQL и создавать отчеты ... - person Shaul Behr; 17.08.2009

Не могли бы вы сделать свой базовый класс отчета универсальным для желаемого типа данных?

public class ReportBase<TEntity> {
    public virtual void SetParameter<T>(string ParameterName, T Value) {
        throw new NotImplementedException("This report does not accept parameters.");
    }

    public abstract TEntity GetData();

    public XElement GetXmlData() {
      // calls GetData() and uses some kind of reflection to turn the data into XML?
    }
}

Вы также можете ограничить TEntity некоторым базовым типом, который показывает, как сериализоваться, упростив GetXmlData. Рассматривали ли вы возможность использования встроенных в .NET функций сериализации XML?

person dahlbyk    schedule 17.08.2009