1

如果我有一个用这个属性定义的类

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显示的字段是这样的错误

在此处输入图像描述

任何帮助将不胜感激。

4

1 回答 1

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 将尝试首先从已加载的导航对象中获取导航对象。如果未加载任何对象,则将为投影中使用的每个导航属性执行选择 SQL 命令。如果该[DeferredLoadingEnabled][1]属性设置为false它不会执行任何查询,并且如果还没有加载任何对象(可以使用“先验”加载它们[LoadWith][2]),它将给出一个NullReferenceException. 因此,在某些情况下,调用 AsEnumerable 可能会损害性能。所有这些东西在where部分AsEnumerable使用时都是无效的。

为了提供默认值,当 noTipificacion不存在时,可以使用 C# 中的null-coalescing operator,而不是使用Count在表上创建额外查找的方法。

现在..你的问题。

SSRS 不支持绑定到项目列表。campoValor列尝试绑定到对象列表,这是不允许的。因此,要么创建子报表(有一个部分对此进行了描述),要么将数据展平(将所有属性都放在一个对象上),然后使用HideDuplicates属性

于 2012-03-12T14:41:47.777 回答