Sql server 带有子选择的DevExpress XPO

Sql server 带有子选择的DevExpress XPO,sql-server,devexpress,xpo,Sql Server,Devexpress,Xpo,我已经下定决心尝试使用XPO编写下一个MSSQL查询: SELECT Gate.Name, grp.maxDate as 'Latest pass', a.Type, a.ReceivedTime as 'Imported at' FROM Access AS a INNER JOIN (SELECT GateId, MAX(OpenTime) AS maxDate FROM


我已经下定决心尝试使用XPO编写下一个MSSQL查询:

SELECT     Gate.Name, grp.maxDate as 'Latest pass', a.Type,  a.ReceivedTime as 'Imported at'
FROM       Access AS a INNER JOIN
                      (SELECT     GateId, MAX(OpenTime) AS maxDate
                        FROM      Access
                        GROUP BY GateId) AS grp ON a.GateId = grp.GateId AND a.OpenTime = grp.maxDate INNER JOIN
                  Gate ON a.GateId = Gate.ID
                  order by Gate.ID
我的访问表有大约2个mill记录,但它只有40个不同的GateId。我想为每个门选择一条线,看起来像:
GateNameOpenTimeTypeImported于

超级网关20/09/2013121/09/2013
Ultragate 19/09/2013022/09/2013

我的Access类如下所示:

    public partial class Access : XPLiteObject
{
    Gate fGateId;
    [Association(@"AccessReferencesGate")]
    public Gate GateId
    {
        get { return fGateId; }
        set { SetPropertyValue<Gate>("GateId", ref fGateId, value); }
    }
    DateTime fOpenTime;
    public DateTime OpenTime
    {
        get { return fOpenTime; }
        set { SetPropertyValue<DateTime>("OpenTime", ref fOpenTime, value); }
    }
    byte fType;
    public byte Type
    {
        get { return fType; }
        set { SetPropertyValue<byte>("Type", ref fType, value); }
    }
    DateTime fReceivedTime;
    public DateTime ReceivedTime
    {
        get { return fReceivedTime; }
        set { SetPropertyValue<DateTime>("ReceivedTime", ref fReceivedTime, value); }
    }
    int fID;
    [Key(true)]
    public int ID
    {
        get { return fID; }
        set { SetPropertyValue<int>("ID", ref fID, value); }
    }
    public Access(Session session) : base(session) { }
}
公共部分类访问:XPLiteObject
{
门体;
[协会(@“AccessReferencesGate”)]
公共门网关ID
{
获取{return fGateId;}
set{SetPropertyValue(“GateId”,ref fGateId,value);}
}
DateTime-fOpenTime;
公共日期时间开放时间
{
获取{return fOpenTime;}
set{SetPropertyValue(“OpenTime”,ref fOpenTime,value);}
}
字节类型;
公共字节类型
{
获取{return fType;}
set{SetPropertyValue(“Type”,ref-fType,value);}
}
DateTime-fReceivedTime;
公共日期时间接收时间
{
获取{return fReceivedTime;}
设置{SetPropertyValue(“ReceivedTime”,ref fReceivedTime,value);}
}
int-fID;
[关键(正确)]
公共整数ID
{
获取{return fID;}
set{SetPropertyValue(“ID”,ref fID,value);}
}
公共访问(会话):基本(会话){}
}
我的门课:

public partial class Gate : XPLiteObject
{
    int fID;
    [Key(true)]
    public int ID
    {
        get { return fID; }
        set { SetPropertyValue<int>("ID", ref fID, value); }
    }
    string fName;
    [Size(20)]
    public string Name
    {
        get { return fName; }
        set { SetPropertyValue<string>("Name", ref fName, value); }
    }
    }
    [Association(@"AccessReferencesGate", typeof(Access))]
    public XPCollection<Access> AccessCollection { get { return GetCollection<Access>("AccessCollection"); } }
    public Gate(Session session) : base(session) { }
}
公共部分类门:XPLiteObject
{
int-fID;
[关键(正确)]
公共整数ID
{
获取{return fID;}
set{SetPropertyValue(“ID”,ref fID,value);}
}
字符串fName;
[尺寸(20)]
公共字符串名
{
获取{return fName;}
set{SetPropertyValue(“Name”,ref-fName,value);}
}
}
[关联(@“AccessReferencesGate”,类型(访问))]
公共XPCollection AccessCollection{get{return GetCollection(“AccessCollection”);}
公共门(会话):基本(会话){}
}
任何答案,甚至RTFM链接将不胜感激

类似于

var accesses = new XPQuery<Access>(session);
var result = 
    from a in accesses 
    where a.OpenTime == a.GateId.AccessCollection.Max(b => b.OpenTime) 
    select new { a.GateId.Name, a.Type, a.ReceivedTime };
var访问=新的XPQuery(会话);
var结果=
从访问中的
其中a.OpenTime==a.GateId.AccessCollection.Max(b=>b.OpenTime)
选择新的{a.GateId.Name,a.Type,a.ReceivedTime};

来自DevExpress支持中心的回答,对我来说很有用:

XPView view = new XPView(typeof(Access));
view.AddProperty("Name", "GateId.Name");
view.AddProperty("LatestPass", "[<Access>][GateId = ^.GateId].Max(OpenTime)");
view.AddProperty("Type", "Type");
view.AddProperty("ImportedAt", "ReceivedTime");
view.Criteria = CriteriaOperator.Parse("OpenTime = [<Access>][GateId = ^.GateId].Max(OpenTime)");
XPView view=newxpview(typeof(Access));
view.AddProperty(“Name”、“GateId.Name”);
view.AddProperty(“LatestPass”,“[[GateId=^.GateId].Max(OpenTime)”);
视图。添加属性(“类型”、“类型”);
view.AddProperty(“ImportedAt”、“ReceivedTime”);
view.Criteria=CriteriaOperator.Parse(“OpenTime=[][GateId=^.GateId].Max(OpenTime)”;

感谢您的帮助,但我认为Access表中的200万行(并且还在不断增长)会使速度变慢。无论如何,我在DevExpress论坛上找到了一个可行的解决方案,我将使用
XPView
将其发布到下面,但我希望生成的SQL查询与您的答案类似。