簡體   English   中英

在SQL Server的ServiceStack OrmLite中使用LoadSelect進行分頁失敗

[英]Paging with LoadSelect fails in ServiceStack OrmLite on SQL Server

我正在嘗試在ServiceStack(4.0.50)服務中完成分頁,並且當 查詢具有多個 使用LoadSelect 聯接 時,我遇到 一個問題。

為了篩選結果以符合安全性要求,我的Get方法從自定義用戶會話中提取信息並構建查詢。 像這樣:

public QueryResponse<Foo> Get(Foos request)
{
    var session = SessionAs<CustomUserSession>();

    var q = Db.From<Foo>().LeftJoin<Foo, User>((s, u) => s.UserId == u.Id);

    // Also tried this with no success
    //q.Skip(request.Skip);
    //q.Take(request.Take);
    q.Limit(request.Skip, request.Take);

    // I do filtering based on the request object for searching
    if (request.Price.HasValue)
    {
        q.And(s => s.Price == request.Price);
    }
    // ... and so on ...

    // Then I do filtering based on roles
    if (session.HasRole("OrgAdmin"))
    {
        // Do some filtering for their organization
    }
    else if (session.HasRole("SiteManager"))
    {
        // More filtering here
    }

    // Ordering also...
    if (request.OrderBy.IsNullOrEmpty())
    {
        q.OrderByFieldsDescending(request.OrderByDesc);
    }
    else
    {
        q.OrderByFields(request.OrderBy);
    }

    var response = new QueryResponse<Foo>
    {
        // This works fine
        Total = (int)Db.Count(q),
        // === Error here ===
        Results = Db.LoadSelect(q)
    };

    return response;
}

計數始終正常,結果的第一頁始終正常。 但是,拉出結果的后續頁面會出現以下錯誤: 如果未將EXISTS引入子查詢,則只能在選擇列表中指定一個表達式。

不幸的是,我需要應用過濾,這需要聯接。 不幸的是,我需要加載引用並希望避免選擇n + 1的情況。 我已經嘗試檢查q對象中的SQL表達式,但是看起來沒有任何方法可以查看發送到服務器的真正最終SQL是什么。

有什么建議么?

注意:我不使用自動查詢,我只是使用QueryBase<>QueryResponse<>對象來使用分頁和計數屬性。

事實證明,這是標准SqlServerDialect.Provider的問題。 由於這是SQL 2012,因此當我在AppHost中切換到SqlServer2012Dialect.Provider時,它可以按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM