2011-05-20 61 views
1

我試圖將WCF數據服務中的部分顯示及其位置列表投影到自定義類型中。這在Silverlight客戶端的WCF數據服務中是可行的嗎?有一些幫助here,但它並沒有顯示回列表以及簡單的字符串。WCF數據服務+ LINQ投影到自定義類型

目前我收到了「NotSupportedException:不支持用表達式d.Base.Title構造或初始化UserQuery + Info類型的實例」。 如果你能告訴我如何在這個語法中擴展位置(我知道Displays.Expand(「位置」))或者如果我需要它,這將是一個獎勵。

LINQPad片斷

var displays = from d in Displays.Where(d => d.Id == 3136) 
select new Info 
{ 
Name = d.Base.Title, 

}; 


displays.Dump(); 

} 
public class Info 
{ 
private string name; 
public string Name 
{ 
    get 
    { 
     return this.name; 
    } 

    set 
    { 
     this.name = value; 
    } 
} 
public IEnumerable<Location> locations; 
public IEnumerable<Location> Locations 
{ 
get{ return this.locations;} 
set{ this.locations = value;} 
} 

回答

1

的問題是,你實際上問你的WCF服務器來構建某種類型的它不知道的知識。既然是無法做到這一點,你必須把它自己的計算機上:

Displays 
    .Where(d => d.Id == 3136) 
    .AsEnumerable() 
    .Select(d => new Info { Name = d.Base.Title }) 

這將在服務器上運行的Where(),但您的計算機上Select()

+1

SO AsEnumerable必須告訴它等待在服務器上執行它。它仍然帶回了我希望避免的所有數據。我想它只能是簡單的類型,你可以限制有效載荷。 – Aligned 2011-05-20 21:33:54

+0

@Kevin,我不知道WCF,但有些提供者可以處理創建匿名類型。 – svick 2011-05-20 22:16:31

1

正如svick所指出的那樣,您不能向服務器詢問它不理解的類型(至少不使用OData)。但你仍然只能要求你想要的物業,而不是更多。

因爲我沒有你的服務提供下面的示例使用演示服務上odata.org:

DemoService ctx = new DemoService(new Uri("http://services.odata.org/OData/OData.svc/")); 

    var q = 
     ctx.Products 
      .Where(p => p.ID == 1) 
      .Select(p => 
       new Product 
       { 
        Category = new Category 
        { 
         Name = p.Category.Name 
        } 
       }); 

    var r = 
     q.AsEnumerable() 
      .Select(p => 
       new 
       { 
        CategoryName = p.Category.Name 
       }); 

第一個查詢「Q」將compoletely在服務器上運行(除建立客戶端側面的對象),它只會得到類別的名稱(以及有關所有實體的元數據)。它會翻譯成URL/Products(1)?$ expand =類別& $ select = Category/Name。

第二個查詢從AsEnumerable開始,它有效地執行第一個查詢,然後它只執行一個簡單的匿名類型轉換。這完全在客戶端完成(沒有服務器交互)。