2010-03-15 82 views
0

這裏是我的方案 我得到LINQ2SQL關係和WCF序列化問題

表1

  • ID

表2

  • ID
  • 家庭
  • FID

與一對多的關係表1之間。 ID和Table2.fid

現在這裏是我的WCF服務代碼

[OperationContract] 

public List<Table1> GetCustomers(string numberToFetch) 
{ 
    using (DataClassesDataContext context = new DataClassesDataContext()) 
    { 
     return context.Table1s.Take(int.Parse(numberToFetch)).ToList(); 
    } 
} 

和我的ASPX頁面代碼

<body xmlns:sys="javascript:Sys" 
    xmlns:dataview="javascript:Sys.UI.DataView"> 
    <div id="CustomerView" 
     class="sys-template" 
     sys:attach="dataview" 
     dataview:autofetch="true" 
     dataview:dataprovider="Service2.svc" 
     dataview:fetchParameters="{{ {numberToFetch: 2} }}" 
     dataview:fetchoperation="GetCustomers"> 
     <ul> 
      <li>{{family}}</li> 
     </ul> 
    </div> 

雖然我在LINQ2SQL設計器中設置序列化模式爲單向我不能夠獲得家庭價值和所有我得到的是這在螢火蟲

{"d":[{"__type":"Table1:#","id":1,"name":"asd"},{"__type":"Table1:#","id":2,"name":"wewe"}]} 

任何幫助將是完全讚賞

回答

1

好了,問題是:你的方法GetCustomers永遠只能從Table1選擇 - 我沒有看到在所有Table2,在那裏你Family柱位於任何參考......

你需要檢查Linq-to-SQL JOIN以及如何從連接表中將數據提取到結果集中。

線沿線的東西:

[DataContract] 
class JoinedResult 
{ 
    [DataMember] 
    public int Table1ID { get; set; } 
    [DataMember] 
    public string Table1Name { get; set; } 
    [DataMember] 
    public string Table2Family { get; set; } 
} 

[OperationContract] 
public List<JoinedResult> GetCustomers(int numberToFetch) 
{ 
    using (DataClassesDataContext context = new DataClassesDataContext()) 
    { 
     var q = from t1 in context.Table1 
       join t2 in context.Table2 on t1.id = t2.fid 
       select new JoinedResult 
          { Table1ID = t1.ID, 
          Table1Name = t1.Name, 
          Table2Family = t2.Family }; 

     return q.Take(numberToFetch).ToList(); 
    } 
} 

,並順便說一句:你真的應該讓numberToFetch int參數!讓來電者進行轉換......

UPDATE:如果你不想明確包括第二個表來進行查詢,你可以改爲添加DataLoadOption對上下文:

DataLoadOptions dlo = new DataLoadOptions(); 
dlo.LoadWith<Table1>(t => t.Table2); 

context.LoadOptions = dlo; 

在這種情況下,當你從Table1加載任何東西時,你都會告訴LINQ始終包含來自Table2的所有元素 - 這也應該起作用。

+0

非常感謝答案,我可能是錯的,但與Linq2sql映射table2是table1的屬性,因此沒有必要加入,我可以像Table1.Table2訪問它,請糾正我,如果我錯了請。 – DevMania 2010-03-15 10:32:05

+0

@devmania:是的,你可以 - 但這並不意味着它會被序列化回客戶端。當您從Table1中選擇* only *時,Linq-to-SQL無法包含所有Table2屬性。如果你想要,你需要問它。但是你是對的 - 你可以寫:'Table2Family = t1.Table2。Family'作爲LINQ – 2010-03-15 11:02:32

+0

的select語句中的最後一行bro非常感謝您的詳細解答,但問題是我正在創建一個可插入系統,因此我希望ta方式只是在不重新編輯WCF的情況下接收新的子表。代碼,所以dataoption將無法正常工作,因爲我必須每次添加新插件時重新編輯它,這真的讓我瘋狂 – DevMania 2010-03-15 11:30:51