【问题标题】:How can I Merge Two LINQ DataSources into a single table for a chart?如何将两个 LINQ 数据源合并到一个图表的单个表中?
【发布时间】:2015-03-15 16:09:42
【问题描述】:

我试图让两个请求我的 SQL 服务器计算每个月的每一天的两个不同的值,并将它们放入一个表中以在图表中使用。

我尝试使用 Union 将它们合并到一个 DataSource 中,但编译失败。以下代码为我提供了两个不同数据源中所需的结果。

这段代码为我提供了我需要的结果。

    Dim ChartDataOpen = (From a In db.Alarms _
             Where a.Generated >= FirstDayOfMonth(DateTimeNow) And a.Generated <= LastDayOfMonth(DateTimeNow) And a.IsClosed = False _
             Group a By CalendarDate = a.Generated.Value.Date Into g = Group _
             Select New With {CalendarDate, .AlarmCount = g.Count()})

    Dim ChartDataClosed = (From a In db.Alarms _
             Where a.Generated >= FirstDayOfMonth(DateTimeNow) And a.Generated <= LastDayOfMonth(DateTimeNow) And a.IsClosed = True _
             Group a By CalendarDate = a.Generated.Value.Date Into g = Group _
             Select New With {CalendarDate, .AlarmClosedCount = g.Count()})

这段代码是我的问题,我找不到一个聪明的方法来根据日历日期(2015 年 1 月 16 日)合并两个数据源并将它们添加到要在图表中使用的单个数据源中。

    Dim ChartData = ChartDataOpen.Union(ChartDataClosed)

    RadHtmlChartAvg.DataSource = ChartData
    RadHtmlChartAvg.DataBind()

最终工作代码:

    Dim ChartData = (From a In db.Alarms _
     Where a.Generated >= FirstDayOfMonth(DateTimeNow) _
       And a.Generated <= LastDayOfMonth(DateTimeNow) _
     Group a By CalendarDate = a.Generated.Value.Date Into g = Group _
     Select New With {
          CalendarDate,
          .AlarmCount = g.Count(),
          .AlarmOpenCount = g.Count(Function(a) a.IsClosed = False),
          .AlarmClosedCount = g.Count(Function(a) a.IsClosed = True)
          })

【问题讨论】:

    标签: vb.net linq merge datasource


    【解决方案1】:

    我认为您所追求的是一种结构,您可以在其中看到一行中的打开和关闭计数:

    Dim ChartData = (From a In db.Alarms _
             Where a.Generated >= FirstDayOfMonth(DateTimeNow) _
               And a.Generated <= LastDayOfMonth(DateTimeNow) _
             Group a By CalendarDate = a.Generated.Value.Date Into g = Group _
             Select New With {
                                 CalendarDate,
                                .AlarmCount = g.Count(Function(x) Not x.IsClosed)
                                .AlarmClosedCount = g.Count(Function(x) x.IsClosed)
                             })
    

    您应该能够将其绘制在图表中,每个日期有两个点或条形。

    【讨论】:

    • 你是对的,我将在一行中获取该数据。 x 和 a 没有在 Select New With 中声明,你能解释一下这部分代码吗?
    • 啊该死,这就是我的 C# 方言。
    • 我能够弄清楚你在做什么并明白了!谢谢你。用工作代码更新了 OP。
    【解决方案2】:

    创建具有相同属性的命名对象:

    我可以在 C# 中做到这一点。您需要为 VB.NET 进行转换

    public class CalendarCount
    {
         public dateTime CalendarDate {get; set;}
         public int Count {get; set;}
    }
    

    这部分我猜vb语法:

    Dim ChartDataOpen = (From a In db.Alarms _
             Where a.Generated >= FirstDayOfMonth(DateTimeNow) _
             And a.Generated <= LastDayOfMonth(DateTimeNow) And a.IsClosed = False _
             Group a By CalendarDate = a.Generated.Value.Date Into g = Group _
             Select New CalendarCount With {CalendarDate, .Count = g.Count()})
    
    Dim ChartDataClosed = (From a In db.Alarms _
             Where a.Generated >= FirstDayOfMonth(DateTimeNow) _
             And a.Generated <= LastDayOfMonth(DateTimeNow) And a.IsClosed = True _
             Group a By CalendarDate = a.Generated.Value.Date Into g = Group _
             Select New CalendarCount With {CalendarDate, .Count = g.Count()})
    

    【讨论】:

    • 但是如何将两个结果合并到一个源中?
    猜你喜欢
    • 2012-02-05
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 2018-05-27
    • 2018-06-23
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    相关资源
    最近更新 更多