【问题标题】:DevExpress XPO with subselects带有子选择的 DevExpress XPO
【发布时间】:2013-09-22 10:25:30
【问题描述】:


尝试使用 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

我的 Access 表有大约 2 个工厂记录,但它只有 40 个不同的 GateId。我想为每个门选择一条线,如下所示:
GateName        开放时间        类型        进口于
..................................................... ....................
Supergate        20/09/2013        1            21/09/2013
Ultragate          19/09/2013        0           22/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) { }
}

我的门课:

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) { }
}

任何答案,甚至是 RTFM 链接都将不胜感激!

【问题讨论】:

    标签: sql-server devexpress xpo


    【解决方案1】:

    类似

    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 };
    

    【讨论】:

    • 感谢您的帮助,但我认为 Access 表中的 200 万行(并且还在增长)会使这变慢。无论如何,我在 DevExpress 论坛上找到了一个可行的解决方案,将其发布在下面
    • 是的,使用 XPView 也可以,但我希望生成的 SQL 查询与我的答案和你的答案相似。
    【解决方案2】:

    来自 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)");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多