2010-03-15 88 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