如何处理 Razor 页面报告的指南

问题描述 投票:0回答:1

我不知道从哪里开始。我有一个名为 Trip 的数据库表。在此表中,每行数据都有以下信息:

TripId
ClientName
PickUpDateTime
PickUpLocation
PickUpDriver
PickUpVehicle

ApptDateTime
ApptLocation

ReturnDateTime
ReturnLocation
ReturnDriver
ReturnVehicle

用户希望司机时间表在一列中包含所有“从”信息,在另一列中包含所有“到”信息。

实际上,这意味着他们希望取件信息和预约信息位于同一列中(因为您是“来自”取件,然后当您完成预约时,您将“来自”预约。) “收件人”信息也是如此。您将“前往”预约,然后您将“前往”返回地点。

由于整个行程存储在数据库的一行中,Trip,我该怎么做?

我尝试为临时表创建 3 个 Iqueryable,并将 2 个 Iqueryable 中的所有字段命名为相同,但是当我将它们与第三个 Iqueryable 连接时,我不知道如何让查询同时查看两个“FromDateTime”,例如例子。这就是我的意思:

可查询:

        IQueryable<ReportModelPU> scheduledTripsPU = from x in _context.Trip
                                                 join y in _context.Client on x.ClientName equals y.DisplayName
                                                 select new ReportModelPU
                                                {
                                                    ClientName = y.DisplayName,
                                                    Driver = x.PickUpDriver,
                                                    Vehicle = x.PickUpVehicle,
                                                    FromDateTime = x.PickUpDateTime,
                                                    FromLocation = x.PickUpLocation,
                                                    ToDateTime = x.ApptDateTime,
                                                    ToLocation = x.ApptLocation,...

        IQueryable<ReportModelRT> scheduledTripsRT = from x in _context.Trip
                                                 join y in _context.Client on x.ClientName equals y.DisplayName
                                                 select new ReportModelRT
                                                {
                                                    ClientName = y.DisplayName,
                                                    Driver = x.ReturnDriver,
                                                    Vehicle = x.ReturnVehicle,
                                                    FromDateTime = x.ReturnDateTime,
                                                    FromLocation = x.ApptLocation,
                                                    ToLocation = x.ReturnLocation,...

        IQueryable<ReportModel> scheduledTripsALL = from x in scheduledTripsPU
                                                    where (x.FromDateTime >= v && x.FromDateTime <= to && x.Driver == selDriver) || (x.FromDateTime >= v && x.FromDateTime <= to && x.Driver == selDriver)
                                                    join y in scheduledTripsRT on x.ClientName equals y.ClientName
                                                    where (y.FromDateTime >= v && y.FromDateTime <= to && y.Driver == selDriver) || (y.FromDateTime >= v && y.FromDateTime <= to && y.Driver == selDriver)
                                                    select new ReportModel
                                                   {
                                                          ClientName = x.ClientName,
                                                          FromDateTime = x.FromDateTime || y.FromDateTime,
                                                          FromLocation = x.FromLocation || y.FromLocation,...

希望这是有道理的。用户希望生成的报告按时间顺序排列,以便驾驶员只需阅读页面即可了解旅程的下一段。注意:单个客户的接送司机和返程司机可能不同。因此,司机 John Doe 可能会在上午 8:30 接 Amy,并在上午 9 点预约让她下车,然后去其他地方接 Nellie,等等。所有这些时间都需要按时间顺序排列,而不是按时间顺序排列。客户。

任何想法都将受到欢迎。是否可以连接这些查询?我不是一个高级程序员,只是设法解决简单的事情。谢谢!

更新:取得了一些进展,实际上得到了一个有效的查询。更改为只是。

然后我将 IQueryable ScheduledTripsALL 编辑为前 2 个查询的串联:

Queryable<ReportModel> scheduledTripsALL = scheduledTripsPU.Concat(scheduledTripsRT);

我现在唯一的问题是,虽然报告可以工作,但如果编辑原始行程表,则报告不会返回任何值。认为我应该做某种类型的重置或刷新?如果你知道,请告诉我。正在努力解决这部分。

c# razor razor-pages iqueryable
1个回答
0
投票

您的解决方案不保持与原始数据源的实时连接。这意味着,如果行程表中的基础数据发生更改,这些更改不会自动反映在您的报告中。为了确保您的报告反映对行程表所做的任何更改,您需要在每次生成报告时重新查询数据。

或者如果您想在表格更新时动态更新报告,您可以做的是:

  1. 定期刷新报告:(投票事件) 为此,您可以创建一个函数,该函数以较小的间隔被调用并重新生成报告,或更新部分报告:(示例代码示例)
using System;
using System.Linq;
using System.Threading;

class Program
{
    static IQueryable<ReportModel> scheduledTripsALL; // Define this variable at a broader scope

    static void Main()
    {
        scheduledTripsALL = RefreshReport(null); // Initialize scheduledTripsALL
        Timer timer = new Timer(RefreshReport, null, TimeSpan.Zero, TimeSpan.FromMinutes(5));
        Thread.Sleep(Timeout.Infinite);
    }

    static void RefreshReport(object state)
    {
        scheduledTripsALL = scheduledTripsPU.Concat(scheduledTripsRT);
    }
}
  1. 刷新行程表更新报告: 为此,您可以创建一个数据库触发器和函数,它将通知表更新,您可以捕获该事件并相应地刷新您的报告:
CREATE OR REPLACE FUNCTION notify_trip_change()
RETURNS trigger AS
$BODY$
BEGIN
    PERFORM pg_notify('trip_change', '');
    RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER trip_trigger
AFTER INSERT OR UPDATE OR DELETE
ON Trip
FOR EACH ROW
EXECUTE FUNCTION notify_trip_change();

using System;
using Npgsql;

class Program
{
    static void Main()
    {
        var connString = "Host=myhost;Username=myuser;Password=mypass;Database=mydb";
        using var conn = new NpgsqlConnection(connString);
        conn.Open();

        conn.Notification += (sender, args) =>
        {
            if (args.Payload == "trip_change")
            {
                 RefreshReport();
            }
        };

        using var cmd = new NpgsqlCommand("LISTEN trip_change", conn);
        cmd.ExecuteNonQuery();
    }

    static void RefreshReport(object state)
    {
        scheduledTripsALL = scheduledTripsPU.Concat(scheduledTripsRT);
    }
}

希望这是您正在寻找的。

© www.soinside.com 2019 - 2024. All rights reserved.