обрабатывать этот источник данных объекта в службах отчетов - PullRequest
1 голос
/ 09 марта 2012

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

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 шоу, является ошибкой вроде этой

enter image description here

Любая помощь будет признательна.

1 Ответ

1 голос
/ 12 марта 2012

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

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();

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

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

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

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

...