2011-03-10 21 views
0

我有兩個類似但不同的Odata服務操作調用(相同的服務操作,不同的參數)在事件處理程序中執行。遍歷代碼,我可以看到每個查詢的CreateQuery調用產生不同的查詢URI,並且當通過瀏覽器請求時,返回的結果是正確的。現在去WE ST!第二個查詢總是返回與第一個查詢相同的結果,除非我指定MergeOption = OverwriteChanges。下面是我如何調用SVC操作的簡化圖:WCF數據服務中的MergeOption

List<Listing> whereToDine = Container.CreateQuery<Listing>("SearchListings")       
               .AddQueryOption("listingTypeIds", "'14'") 
               .AddQueryOption("cityId", CityId.ToString()) 
               .AddQueryOption("radius", SearchRadius.ToString()) 
               .AddQueryOption("skipIndex", "0") 
               .AddQueryOption("pageSize", (PageSize * NumPages).ToString())                   
               .AddQueryOption("sortType", "'name'").ToList<Listing>(); 

任何人有任何想法,爲什麼這是發生?

回答

1

客戶端確實跟蹤實體(假設Listing是一個實體類型)。因此,Container(DataServiceContext)在查詢評估時持有對由它返回的所有實體的引用。

這對於能夠跟蹤對實體的更改是必要的,以便在您調用SaveChange時,上下文知道哪些實體需要向服務器發送更新請求。

當前客戶端不執行屬性級別的跟蹤,所以它只知道整個實體是否發生了變化。如果其上的單個屬性發生更改,則不會

因此,當它讀取來自服務器的數據並且響應包含客戶端已經跟蹤的實體時,它必須確定來自服務器的數據是要使用的數據還是客戶端上的值應該是(基本上在這一點上它有兩個版本的同一個實體,一個來自客戶端,一個來自服務器)。

MergeOption是告訴客戶在這種情況下該做什麼的設置。

默認情況下,客戶端值取勝,思考是這樣的:如果您更改了客戶端上的某些值,則不希望服務器上的值覆蓋更改,直到您通過SaveChanges提交它們。

因此,在第一次調用服務操作時,客戶端從服務器獲取實體(第一次),並獲得結果。在第二次調用中,您可能會獲得相同的實體,但是會有新的值。但客戶端上的默認設置是保留客戶端值,因此對查詢的評估有效地降低了來自服務器的傳入數據。

MergeOption是告訴客戶要做什麼的正確方法。