2011-06-05 103 views
3

我正在用C#/ wcf編寫RESTful服務,並且需要在GET上放置過濾器。例如,有多少條記錄返回,也許如果我想通過一些過濾等考慮以下代碼:如何使此代碼幹?

[WebGet(UriTemplate = "/devices/{DeviceId}/positions")] 
     public List<GPSPosition> GetDevicePositions(string deviceId) 
     { 
      //Lookup device: 
      using (var context = new MobileModelContext(ContextManager.AccountGKey.Value)) 
      { 
       var d = context.Devices.Where(aa => aa.DeviceId == deviceId).FirstOrDefault(); 
       if (d == null) 
       { 
        outgoingResponse.StatusCode = HttpStatusCode.NotFound; 
        outgoingResponse.StatusDescription = "Device not found"; 
        return null; 
       } 

       var query = from p in context.Positions 
          where p.DeviceKey.Equals(d.DeviceKey) 
          select new GPSPosition 
          { 
           PositionGKey = p.PositionGKey, 
           Latitude = p.Latitude, 
           Longitude = p.Longitude, 
           Speed = p.Speed, 
           Accuracy = p.Accuracy, 
           Altitude = p.Altitude, 
           GPSTime = p.GPSTime, 
           DeviceTime = p.DeviceTime 
          }; 

       return query.ToList(); 
      } 
     } 

     [WebGet(UriTemplate = "/devices/{DeviceId}/positions?RecordCount={RecordCount}")] 
     public List<GPSPosition> GetDevicePositions2(string deviceId, int recordCount) 
     { 
      //Lookup device: 
      using (var context = new MobileModelContext(ContextManager.AccountGKey.Value)) 
      { 
       var d = context.Devices.Where(aa => aa.DeviceId == deviceId).FirstOrDefault(); 
       if (d == null) 
       { 
        outgoingResponse.StatusCode = HttpStatusCode.NotFound; 
        outgoingResponse.StatusDescription = "Device not found"; 
        return null; 
       } 

       var query = from p in context.Positions 
          where p.DeviceKey.Equals(d.DeviceKey) 
          select new GPSPosition 
          { 
           PositionGKey = p.PositionGKey, 
           Latitude = p.Latitude, 
           Longitude = p.Longitude, 
           Speed = p.Speed, 
           Accuracy = p.Accuracy, 
           Altitude = p.Altitude, 
           GPSTime = p.GPSTime, 
           DeviceTime = p.DeviceTime 
          }; 

       return query.Take(recordCount).ToList(); 
      } 
     } 

大量的重複。我可以將代碼移到其他函數中,但仍然有2個模板,我有2個函數。有沒有辦法爲/ position /製作1個模板,以涵蓋所有可能的「?」場景?

回答

2

QA提示context.Devices.Where(aa => aa.DeviceId == deviceId).FirstOrDefault();可以縮短context.Devices.Find(deviceId);

QA提示from p in context.Positions ...你可能想在你的表中創建一個視圖,而不是... select new GPSPosition { ... }您只需編寫正context.PositionViews.Where(x => x.DeviceKey == d.DeviceKey).ToList();

質量保證提示:您可能想要使用.AsNoTracking()來優化性能。

質保提示:您可能希望在方法聲明中使用可選參數。例如:

public List<GPSPosition> GetDevicePositions(string deviceId, int limit = 20) 
{ 
// you code here 
} 

或者,如果WCF不支持只是還沒有。這裏是一個變通:

您可以通過 得到預期的效果從 UriTemplate您WebGet或 WebInvoke屬性忽略查詢字符串,並使用 WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters 從您的處理程序內檢查, 設置默認值等,查詢 參數。

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=451296&wa=wsignin1.0

+0

#1:不知道這將如何工作,因爲我需要指定我正在尋找哪一列,是否正確? #2:不起作用。 GPSPosition是專門爲REST + JSON創建的POCO類。如果我使用實體生成的類,那麼當它是JSON時它看起來非常糟糕。這就是爲什麼我把它放在第一位。 #3我可以使用可選參數與WCF模板?! – katit 2011-06-05 21:01:20

+0

#1:查找(..)按鍵列(我假設DeviceId是一個關鍵列)進行搜索,#2與POCO類完美配合,可以根據需要應用映射 – 2011-06-05 21:11:47

+0

不,deviceId不是關鍵列。它是唯一的索引,但主鍵是IDENTITY,所以它不能像這樣工作。 #2。這真的很貴嗎?事實上 - 最多隻有少數記錄。 – katit 2011-06-05 21:15:07

3

採取列舉源和 產生元素,直到 已經取得或源包含 沒有更多的元素計數的元素。在最大 n項

由於Take(n)回報,但少如果有較少的可用你可以重寫:

public List<GPSPosition> GetDevicePositions(string deviceId) 
    { 
    return GetDevicePositions2(deviceId, int.MaxValue) 
    } 

然後將返回所有項目。

+0

謝謝!這是我的,但我不知道是否有「可選」的參數,我可以使用模板? – katit 2011-06-05 21:11:29