Почему 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-запросе?