第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對HasMany引用的查詢

對HasMany引用的查詢

C#
胡說叔叔 2019-07-17 18:49:04
對HasMany引用的查詢我有一個這樣的實體模型:public class Request{     public virtual IList<Response> Responses { get; set; }}public class Response{     public virtual DateTime Timestamp { get; set; }     public virtual bool Success { get; set; }}我想創(chuàng)造一個查詢那會給我所有請求最近反應(關(guān)于其時間戳)是成功..這是如何做到的呢?
查看完整描述

3 回答

?
HUH函數(shù)

TA貢獻1836條經(jīng)驗 獲得超4個贊

差不多了一直以來,NHibernate確實對此有答案。我們在這里試圖實現(xiàn)的是這樣一個SQL語句:

// final Request selectionSELECT request.[RequestId] 
 FROM [Request] request 

   // Only requests, which are successful, and have Max(date)
   WHERE request.[RequestId] IN 
   (
     SELECT successResponse.RequestId as y0_ 
      FROM [Response] successResponse 

        // response which max date is equal to the upper response
        // and which RequestId corresponds with supper upper Request
        WHERE EXISTS        (
          SELECT maxResponse.RequestId as y0_           , max(maxResponse.[DateTime]) as y1_           
           FROM [Response] maxResponse 

           // do the MAX only for current Request
           WHERE maxResponse.RequestId = successResponse.RequestId 
           GROUP BY maxResponse.RequestId 

           // assure that the Response match is on the max DateTime
           HAVING max(maxResponse.[DateTime]) = successResponse.[DateTime]
        ) 
        AND successResponse.[Success] = 1
   )

注:

  1. 期待

    反應  RequestId

  2. 上面用的是C#//注釋而不是SQL--

現(xiàn)在,NHibernate和QueryOver的魔力:

// This declaration will allow us, to use a reference from middle SELECT// in the most deeper SELECTResponse response = null;// the most INNER SELECTvar maxSubquery = QueryOver.Of<Response>()
   .SelectList(l => l    .SelectGroup(item => item.RequestId)
    .SelectMax(item => item.DateTime)
    )
    // WHERE Clause
   .Where(item => item.RequestId == response.RequestId)
   // HAVING Clause
   .Where(Restrictions.EqProperty(
      Projections.Max<Response>(item => item.DateTime),
      Projections.Property(() => response.DateTime)
    ));// the middle SELECTvar successSubquery = QueryOver.Of<Response>(() => response)
    // to filter the Request
    .Select(res => res.RequestId)
    .WithSubquery
    .WhereExists(maxSubquery)
    // now only these wich are successful
    .Where(success => success.Success == true)
    ;

此時我們不得不對內(nèi)子進行選擇,嵌套。讓我們使用它們:

// the most outer SELECTvar query = session.QueryOver<Request>();query.WithSubquery
    // our Request ID is IN(...
    .WhereProperty(r => r.ID)
    .In(successSubquery);var list = query    .List<Request>();

最后,我不是在討論這個概念。不是表演。我會使用一個關(guān)于響應“IsActive”的設置,使它更容易..這就是該怎么做的答案.。


查看完整回答
反對 回復 2019-07-17
?
Cats萌萌

TA貢獻1805條經(jīng)驗 獲得超9個贊

我要試試這個,這里有一些Linq(使用Query)。

session.Query<Request>()
    .Where(request => 
        request.Responses.Count() > 0 && 
        request.Responses.OrderByDescending(response => response.Timestamp)
                         .First()
                         .Success);

不知道這是否行得通。


查看完整回答
反對 回復 2019-07-17
?
慕碼人2483693

TA貢獻1860條經(jīng)驗 獲得超9個贊

SelectList表示投影,即我們要返回的一組列/公式。因此,非常深的SELECT必須返回2個值,這些值用于上層查詢。(尋找匹配的記錄)..可能會吧.Select()帶著帕拉姆我也要說.。在子查詢中使用get(1)在這種情況下不起任何作用。DB引擎將創(chuàng)建正確的執(zhí)行計劃,一旦找到匹配。它會停止的。因此,在這個層面上,它是不需要的。如果我完全理解你的觀點??傊?,我們的任何優(yōu)化,幫助DB引擎.。(可受歡迎;) 

查看完整回答
反對 回復 2019-07-17
  • 3 回答
  • 0 關(guān)注
  • 641 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號