«новое» внутри бетонной проекции типа вызывается только один раз - PullRequest
12 голосов
/ 01 августа 2011

У меня простой запрос Linq2Sql:

var result = from t in MyContext.MyItems
             select new MyViewModelClass()
             {
                 FirstProperty = t,
                 SecondProperty = new SomeLinq2SqlEntity()
             }      

Проблема в том, что кажется, что new SomeLinq2SqlEntity() выполняется только один раз для последовательности, поэтому все экземпляры MyViewModelClass в результате совместного использования запросассылка на один объект.

Обновление : вот как я это быстро проверил:

result[0].SecondProperty.MyField = 10;

Используя отладчик, я могу проверить, что MyField было установлено на 10 во всех случаях.

Когда я заменяю запрос LINQ на foreach, он работает как положено:

  var result = from t in MyContext.MyItems select t;
  var list = new List<MyViewModelClass>();
  foreach (var item in result)
  {
      list.add(new MyViewModelClass()
             {
                 FirstProperty = item,
                 SecondProperty = new SomeLinq2SqlEntity()
             });       
  }

Я не нашел корень проблемы, носообщение, помеченное как asnwer, обеспечивает хороший обходной путь.Проверьте этот ответ для подробного описания: «новый» внутри проекции типа бетона вызывается только один раз

Ответы [ 2 ]

4 голосов
/ 01 августа 2011

Возможно, это как-то связано со странной IQueryable реализацией вашего провайдера.Ответ Aducci извлекает данные из базы данных с помощью вызова AsEnumerable() и выполняет запрос к этому набору, который отличается от выполнения его с помощью IQueryable.

Например, IQueryable создает ExpressionTree, который затем анализируетв соответствии с конкретным провайдером (то есть выполняет общий код один раз для оптимизации), в то время как IEnumerable принимает Func и выполняет его так, как вы ожидаете.

Подробнее можно прочитать здесь:

http://msdn.microsoft.com/en-us/vcsharp/ff963710

2 голосов
/ 01 августа 2011

Вы пробовали использовать объект SomeLinq2SqlEntity с linq для объектов?

var result = (from t in MyContext.MyItems
             select new
             {
                 FirstProperty = t
             })
             .AsEnumerable() 
             .Select(t => new MyViewModelClass()
             {
                 FirstProperty = t.FirstProperty ,
                 SecondProperty = new SomeLinq2SqlEntity();
             });   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...