Linq2Sql关系和WCF序列化问题

时间:2010-03-15 09:16:27

标签: linq wcf asp.net-ajax

这是我的情景 我得到了

表1

  • ID
  • 名称

表2

  • ID
  • 家族

在Table1之间设置一对多关系。 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设计器中将序列化模式设置为Unidirectional但我无法获得系列值,所有我得到的就是这个在firebug中

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

任何帮助都将完全受到赞赏

1 个答案:

答案 0 :(得分: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();
    }
}

和btw:你应该让numberToFetch成为一个INT参数!让来电者进行转换......

更新:如果您不想明确包含要查询的第二个表,则可以在您的上下文中添加DataLoadOption

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

context.LoadOptions = dlo;

在这种情况下,当你从Table2加载任何内容时,你告诉LINQ始终包含Table1中的所有元素 - 这也应该有用。