Нарушение контракта с кодом для проецирования в анонимный тип с использованием IQueryable

#c#-4.0 #iqueryable #code-contracts

#c #-4.0 #iqueryable #код-контракты

Вопрос:

Мне трудно понять, почему я получаю нарушение контракта с кодом в следующем фрагменте кода:

      // servicequery is of type System.Data.Services.Client.DataServiceQuery<DividendData>
     // therefore implements IQueryable
     var serviceQuery = CreateDataService().DividendData;
     Contract.Assume(serviceQuery != null);
     Contract.Assume(serviceQuery.Any());
     var data = serviceQuery
        .Select(div => new {I = 2});
  

Нарушение заключается в том, что: CodeContracts: requires unproven: constructor != null прямо при назначении.

Если я изменю этот код на следующий, нарушение исчезнет:

   class resulttype
  {
     public int I { get; set; }
  }


  var serviceQuery = CreateDataService().DividendData;
  Contract.Assume(serviceQuery != null);
  Contract.Assume(serviceQuery.Any());
  var data = serviceQuery
     .Select(div => new resulttype() {I = 2});
  

Мой вопрос «почему?».

Комментарии:

1. Не могли бы вы предоставить трассировку стека исключений? Какое из двух назначений выдает его?

Ответ №1:

Похоже, ему нужен реальный класс в качестве контракта. Что вы можете сделать, так это:

 var serviceQuery = CreateDataService().DividendData;
Contract.Assume(serviceQuery != null);
Contract.Assume(serviceQuery.Any());
var data = serviceQuery.ToList().Select(div => {I = 2});
  

В любом случае, это очень странно, что вы там делаете…

Комментарии:

1. Кроме того, кажется, что вы запускаете службу дважды, возможно, вы захотите поместить результат в переменную, а затем проверить, есть ли в ней элементы

2. Итак, я тоже не понимаю, почему это странно? Я пытаюсь выбрать подмножество данных (только определенные столбцы) из службы данных DividendData WCF.