2011-01-22 45 views
2

我有一個簡單的DomainService:LINQ在WCF服務(的DomainService)

[EnableClientAccess] 
public class DomainService1 : IDomainService1 
{ 
    [Query(IsComposable = true)] 
    public IEnumerable<int> GetCollection(int from, int count) 
    { 
     const int max = 100000; 
     int[] _collection; 

     _collection = new int[max]; 

     for (int i = 0; i < max; i++) 
     { 
      _collection[i] = i; 
     } 

     return _collection.Skip(from).Take(count); 
    } 
} 

在客戶端我已經生成的代理:客戶

我需要在客戶端叢毛LINQ查詢,並在服務器端執行它並通過服務返回查詢結果。

當我做:

var res1 = client.GetCollection(100, 20).Skip(5).Take(5); 
比client.GetCollection(100,20)在服務器側執行且

跳過(5)和帶(5) 在客戶端。

當我這樣做:

var res2 = client.GetCollection(100, 90000).Skip(10).Take(10); 

它拋出異常:

基礎連接已關閉:連接被意外關閉。

我認爲這是由於,client.GetCollection(100,90000)返回大的結果集。

是一種獲取有關服務器故障原因的更好信息的方法? 它可能執行服務器上的客戶端查詢?我認爲是這樣,因爲這允許LinqToEntitiesDomainService。但是我不能使用EF,因爲我只能訪問內存中的對象列表。

謝謝。

JPO

+0

我沒有看到你在哪裏撰寫查詢在客戶端。 – leppie 2011-01-22 21:23:34

回答

1

唯一的例外是幾乎可以肯定是由於大的數據集,所以你可以嘗試正在增加在<最大緩衝區/消息的大小結合>配置,如:

<binding name="MyServiceBinding" maxReceivedMessageSize="6291456" maxBufferSize="6291456"> 
    <readerQuotas maxArrayLength="6291456" maxStringContentLength="6291456"/> 
</binding> 

確保你將這些添加到客戶端服務器的配置中的綁定中。

至於獲取查詢的其他客戶端定義的部分在服務器上執行,您可能需要使返回值爲IQueryable <int>。