Почему Linq не может перевести выражение / обрабатывать как локальное выражение и выдает исключение? - PullRequest
2 голосов
/ 31 августа 2009

Я задал вопрос здесь об ошибке Linq, которая возникает в результате смешивания Linq-To-SQL с кодом C #. Вкратце, компилятор запутывается и не понимает, что вы собираетесь вызывать локальную функцию для набора результатов после того, как вернется из базы данных.

Ответ, который я принял, состоял в том, чтобы использовать AsEnumerable() в наборе результатов, что вынудило его вернуть все столбцы перед дальнейшими вычислениями.

Моя проблема сейчас заключается в том, что очень похожим образом я сейчас пытаюсь вызвать метод объекта, который связан с моим набором результатов, через внешний ключ, например ::

.
var q =
  from c in MyCities.AsEnumerable() // note the AsEnumerable, forcing the query to execute before accessing properties of c
  let cy = c.County
  select new { CityName = c.Name, CountyName = cy.Name, CountyFoo = cy.Foo() };

И угадайте, что - это снова вызывает это старое исключение. Зачем? Очевидно, потому что нам нужно снова вернуться к базе данных, чтобы загрузить соответствующие County из c. Только на этот раз я не могу позвонить AsEnumerable(), потому что c имеет только один округ, а не коллекцию!

Это был дурацкий болтун!

Как мне обойти это?

1 Ответ

3 голосов
/ 31 августа 2009

Еще один уровень косвенности должен исправить это, хотя я не знаю, насколько это читабельно. Удалите CountyFoo = cy.Foo() и CountyName = cy.Name из набора результатов и замените его на County = cy, чтобы получить ..

var q =
  from c in MyCities.AsEnumerable() 
  let cy = c.County
  select new { CityName = c.Name, County = cy };

затем добавьте

var p = q.AsEnumerable().Select(x => 
    new 
    { 
        CityName = x.CityName, 
        CountyName = x.County.Name, 
        CountyFoo = x.County.Foo() 
    });

Затем вы можете перечислить более p. Это довольно запутанно, хотя. Зачем вам все это в строке LINQ запроса?

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