Отношения Linq2Sql и проблема сериализации WCF - PullRequest
0 голосов
/ 15 марта 2010

вот мой сценарий я получил

Table1

  • ID
  • имя

Table2

  • ID
  • семья
  • шлагты

с отношением один ко многим между таблицей 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, я не могу получить семейное значение и все, что я получаю, это в firebug

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

любая помощь будет полностью оценена

1 Ответ

1 голос
/ 15 марта 2010

Ну, суть в том, что ваш метод GetCustomers выбирается только из Table1 - я не вижу никакой ссылки на Table2, где находится ваш столбец Family ......

Вам нужно проверить соединения Linq-to-SQL и узнать, как извлечь данные из объединенной таблицы в ваш набор результатов.

Что-то вроде:

[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! Пусть звонящий сделает преобразование ......

ОБНОВЛЕНИЕ: если вы не хотите явно включать вторую таблицу для запроса, вы можете вместо этого добавить DataLoadOption в свой контекст:

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

context.LoadOptions = dlo;

В этом случае вы указываете LINQ всегда включать все элементы из Table2, когда он загружает что-либо из Table1 - это тоже должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...