0

假设我有一个名为 DailyVisitorSummary 的持久类,它描述了每个网页每天有多少访问者。为简单起见,假设我们将日期表示为纯整数。

现在我想创建一个查询来检索特定日期的数据,以及前几天和后几天的数据。我所知道的是,同一个网页肯定最多会有一个前一天和后一天的数据记录,所以我可以编写一个 SQL 查询(MySQL 语法),如:

SELECT c.*,p.*,n.* from DailyVisitorSummary c
LEFT JOIN DailyVisitorSummary p ON p.WebPage = c.WebPage AND p.Day = c.Day - 1
LEFT JOIN DailyVisitorSummary n ON n.WebPage = c.WebPage AND n.Day = c.Day + 1
WHERE c.Day = 453;

我想用结果填充以下视图模型:

public class VMDailyVisitors3Day {
   public VMDailyVisitors CurrentDay { get; set; }
   public VMDailyVisitors PreviousDay { get; set; }
   public VMDailyVisitors NextDay { get; set; }
}

public class VMDailyVisitors {
    public int Day { get; set;; }
    public int WebPageID { get; set; }
    public int VisitorCount { get; set; }
}

如何使用 Linq to XPO 进行此查询?我需要一个 LINQ 解决方案,因为我需要在服务器模式 MVC GridView 中使用结果。

4

2 回答 2

1

Linq to XPO 仅支持组加入。一种可能的解决方案是在数据库中创建一个 SQL 视图,并使用您的 SQL 查询向其中填充数据。然后您可以将另一个持久类映射到该视图以获取数据。

视图必须至少有一列具有唯一值。不要使用 newid 函数或类似函数来生成唯一值,因为这种方法会在每次查询数据时为同一行分配不同的值。服务器模式使用键列来标识行。使用实际数据填充键列。例如,连接来自 WebPage 和 Day 列的值。不过,请确保这会产生不同的值。

于 2013-06-22T12:28:13.527 回答
1

通过使用 PersistentAliasAttribute 作为中间步骤,我在 DX 支持的帮助下找到了一种解决方法,我可以在其中进行自由联接,然后在 XPQuery 中使用该属性。如果有人感兴趣,请查看这里

于 2013-07-17T15:47:56.407 回答