我不知道从哪里开始。我有一个名为 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);
我现在唯一的问题是,虽然报告可以工作,但如果编辑原始行程表,则报告不会返回任何值。认为我应该做某种类型的重置或刷新?如果你知道,请告诉我。正在努力解决这部分。
您的解决方案不保持与原始数据源的实时连接。这意味着,如果行程表中的基础数据发生更改,这些更改不会自动反映在您的报告中。为了确保您的报告反映对行程表所做的任何更改,您需要在每次生成报告时重新查询数据。
或者如果您想在表格更新时动态更新报告,您可以做的是:
- 定期刷新报告:(投票事件) 为此,您可以创建一个函数,该函数以较小的间隔被调用并重新生成报告,或更新部分报告:(示例代码示例)
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);
}
}
- 刷新行程表更新报告: 为此,您可以创建一个数据库触发器和函数,它将通知表更新,您可以捕获该事件并相应地刷新您的报告:
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);
}
}
希望这是您正在寻找的。