обрабатывать этот объектный источник данных в службах отчетов

Если бы у меня был класс, определенный с этими атрибутами

public class GestionesDataSet
{
    public DateTime GestionInicio { get; set; }
    public DateTime GestionFin { get; set; }
    public Nullable<DateTime> LlamadaInicio { get; set; }
    public Nullable<DateTime> LlamadaFin { get; set; }
    public string Login { get; set; }
    public string Tipificacion { get; set; }
    public List<CamposGestion> campoValor { get; set; } 
}   

И класс под названием CamposGestion определяется следующим образом.

public class CamposGestion
{
    public string Nombre { get; set; }
    public string Valor { get; set; }
}

Как я могу определить отчет, в котором я могу использовать поле, которое ссылается на список других элементов?

Я попытался использовать один набор данных, где я могу установить этот linq в качестве источника данных объекта.

     var gestiones = (from G in db.Gestion
                         where
                         G.IDTipificacion == idTipificacion
                         && (from T in db.Tipificacion where T.IdTipificacion == G.IDTipificacion select T.Servicio.IDServicio).AsEnumerable().Contains(idServicio)
                         select G).AsEnumerable().Select(xx => new GestionesDataSet()
                         {
                             GestionInicio = xx.HoraInicio,
                             GestionFin = xx.HoraFin,
                             @Tipificacion = ((from T in db.Tipificacion select T).Where(x => x.IdTipificacion == xx.IDTipificacion).Count() > 0 ?
                                              (from T in db.Tipificacion where T.IdTipificacion == xx.IDTipificacion select T.Nombre).FirstOrDefault() : ""),
                             LlamadaInicio = xx.Llamada.HoraInicio,
                             LlamadaFin = xx.Llamada.HoraFin,
                             Login = xx.Llamada.Sesion.Usuario.Nombre,
                             campoValor = xx.CampoValor.Select(aux  => new CamposGestion() { 
                                                Nombre = aux.ConfiguracionCampo.Campo.Nombre,
                                                Valor = aux.Valor
                                        }).ToList()
                         }).ToList();

Но что я хочу увидеть в отчете, поле, содержащее List, показывает ошибку, подобную этой

введите здесь описание изображения

Любая помощь будет оценена.


person Jorge    schedule 09.03.2012    source источник


Ответы (1)


Я бы переписал запрос так:

var gestiones = 
    from xx in db.Gestion
    where
    xx.IDTipificacion == idTipificacion
    && (from T in db.Tipificacion 
        where T.IdTipificacion == xx.IDTipificacion select T.Servicio.IDServicio).AsEnumerable().Contains(idServicio)
    select new GestionesDataSet()
    {
        GestionInicio = xx.HoraInicio,
        GestionFin = xx.HoraFin,
        @Tipificacion = (from T in db.Tipificacion where T.IdTipificacion == xx.IDTipificacion select T.Nombre).FirstOrDefault() ?? "",
        LlamadaInicio = xx.Llamada.HoraInicio,
        LlamadaFin = xx.Llamada.HoraFin,
        Login = xx.Llamada.Sesion.Usuario.Nombre,
        campoValor = xx.CampoValor.Select(aux => new CamposGestion()
        {
            Nombre = aux.ConfiguracionCampo.Campo.Nombre,
            Valor = aux.Valor
        }).ToList()
    }).ToList();

Когда вы вызываете проекцию (Select) после вызова AsEnumerable, LINQ попытается сначала получить объекты навигации из уже загруженных. Если ни один объект не загружен, будет выполнена команда select SQL для каждого свойства навигации, используемого в проекции. Если для свойства [DeferredLoadingEnabled][1] установлено значение false, он не будет выполнять никаких запросов, и если ни один объект уже не загружен (они могут быть загружены "априори" с помощью [LoadWith][2]), он выдаст NullReferenceException. Таким образом, в некоторых ситуациях вызов AsEnumerable может снизить производительность. Все эти вещи недействительны, когда AsEnumerable используется в частях where.

Для задания значения по умолчанию, когда Tipificacion не существует, можно использовать нулевой оператор объединения из C# вместо использования метода Count, который создает дополнительный поиск в таблице.

Теперь .. к вашей проблеме.

SSRS не поддерживает привязку к списку элементов. Столбец campoValor пытается привязаться к списку объектов, что недопустимо. Поэтому либо вы создаете подотчет (есть раздел который описывает это) или вы сглаживаете свои данные (имея все свойства в одном объекте), а затем используйте HideDuplicates< /а> свойство

person Adrian Iftode    schedule 12.03.2012