如何使用XPO为特定行执行自由(非关联)连接

本文关键字:自由 关联 连接 执行 XPO 何使用 | 更新日期: 2023-09-27 18:19:18

假设我有一个名为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中使用结果。

如何使用XPO为特定行执行自由(非关联)连接

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

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

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