Почему Linq не может переводить выражение/обращение как локальное выражение и выдает исключение?

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

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

Dwat, который был просто wabbit!

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

Ответ 1

Еще один уровень косвенности должен исправить это, хотя я не знаю, насколько это читаемо. Удалите 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. Однако это довольно запутанно. Зачем вам все это в LINK-запросе?