У участника нет поддерживаемого перевода в SQL. При попытке доступа к свойству в моем классе Partial в операторе LINQ to SQL. Лямбда-выражение? - PullRequest
4 голосов
/ 22 января 2010

В моей базе данных 3 таблицы

  • Страна
  • Город
  • Дом

Таблица стран выглядит как

 CountryID
 Name    

Стол города выглядит как

 CountryID
 CityID
 Name

Дом

 CountryID
 CityID
 HouseID
 Name

Я использую LINQ to SQL, и приведенные выше таблицы становятся классами, имеют свои свойства и т. Д.

Теперь у меня есть собственный абстрактный класс с именем

Расположение

И создал Частичные Классы для Страна, Город, Дом, который наследует Местоположение абстрактного класса

и, следовательно, может иметь общее такие функции, как FindByID () и свойства, такие как .Parent (типа Location)

Теперь давайте возьмем .Parent который в основном возвращает Parent для каждого класса

так

Дом вернется

 .Parent  //as City

Город вернется

 .Parent  //as Country

Страна вернется

 .Parent  //as Country

Теперь при попытке использовать

City.Parent в операторе LINQ to SQL я получаю

 The member 'Location`1[City].Parent' has no supported translation to SQL.

Теперь люди упоминают о том, как вы можете использовать лямбда-выражения для решения этой проблемы. Может ли кто-нибудь дать мне хороший пример для такой ситуации

что должно. Родитель похож на

 Location Parent
 {
    get
   {
        //Please fill Lambda expression here
   }
 }

1 Ответ

2 голосов
/ 22 января 2010

Ваше свойство .Parent будет в порядке в LINQ-to-Objects, но, как говорится в сообщении, оно будет иметь без понятия , что с этим делать, если ему нужно создать TSQL. Он не может прочитать ваш код C # (IL в то время), чтобы понять смысл. В лучшем случае может быть чем-то, что вы можете сделать с некоторой функцией, которая возвращает Expression некоторой формы, но работать с ней будет неинтересно.

По сути, при взаимодействии с ORM вы можете говорить только в терминах вещей, о которых он уже знает. Вы можете возможно сопоставить UDF с контекстом данных и использовать его, но опять же - не очень.

Для работы с Expression вам потребуется использовать Expression.Invoke и самокручивающиеся лямбды (при их объединении делать интересные вещи, такие как сравнение их с ожидаемым значением); это действительно не будет хорошим. Возможно, я мог бы собрать пример вместе, но, честно говоря, я думаю, что ваш DAL / репозиторий не должен просто использовать эти дополнительные свойства, а ограничиться использованием вместо них свойств ORM. Даже если это немного подсушит.

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