0

在我的web api中,我需要從linq查詢本身執行一個方法。我的linq查詢代碼片段所屬的方法如下所示,它調用本地方法來獲取所需的數據。如何從linq查詢調用本地方法

var onlineData = (from od in db.RTLS_ONLINEPERSONSTATUS 
        let zoneIds = db.RTLS_PERSONSTATUS_HISTORY.Where(p => p.person_id == od.PERSONID).OrderByDescending(z => z.stime > startOfThisDay && z.stime < DateTime.Now).Select(z => z.zone_id).ToList() 

        let zoneIdsArray = this.getZoneList((zoneIds.ToArray())) 
        let fzones = zoneIdsArray.Select(z => z).Take(5) 
        select new OnlineDataInfoDTO 
        { 
         P_ID = od.PERSONID, 
         T_ID = (int)od.TAGID, 
         LOCS = fzones.ToList() 
        } 

public int[] getZoneList(decimal[] zoneIdsArray) 
    { 
     int[] zoneIds = Array.ConvertAll(zoneIdsArray, x => (int)x); 
     List<int> list = zoneIds.ToList(); 
     for (int c = 1; c < zoneIdsArray.Count(); c++) 
     { 
      if (zoneIdsArray[c] == zoneIdsArray[c - 1]) 
      { 
       list.Remove((int)zoneIdsArray[c]); 
      } 
     } 
     return list.ToArray(); 
    } 

我正在逐漸讓zoneIdsArray = this.getZoneList異常((zoneIds.ToArray())),有沒有什麼辦法來解決這個問題。我有邏輯來解決我的問題從這個鏈接(Linq query to get person visited zones of current day),給定的邏輯是絕對正常的我的要求,但我在執行它時遇到問題。

回答

1

實現這一目標的一種方法是在客戶端而不是基礎LINQ提供程序上執行投影。這可以通過分離您的查詢進行到2步:

var peopleStatus = 
    from od in db.RTLS_ONLINEPERSONSTATUS 
    let zoneIds = db.RTLS_PERSONSTATUS_HISTORY 
     .Where(p => p.person_id == od.PERSONID) 
     .OrderByDescending(z => z.stime > startOfThisDay && z.stime < DateTime.Now) 
     .Select(z => z.zone_id) 
     .ToList() 
    select new 
    { 
     Person = od, 
     ZoneIds = zoneIds, 
    }; 

var onlineData = 
    from od in peopleStatus.ToList() 
    let zoneIdsArray = this.getZoneList((od.ZoneIds.ToArray())) 
    let fzones = zoneIdsArray.Select(z => z).Take(5) 
    select new OnlineDataInfoDTO 
    { 
     P_ID = od.Person.PERSONID, 
     T_ID = (int)od.Person.TAGID, 
     LOCS = fzones.ToList() 
    }; 
+0

感謝ü這麼多達林Dimtrov,你解決我的問題,我覺得很難做到非常感謝 –