Создание запрашиваемого свойства для объекта linq to sql - PullRequest
1 голос
/ 29 октября 2010

У меня есть простая структура таблиц в SQL Server:

Одна таблица, в которой хранится список велосипедов (Bikes), и вторая таблица, в которой хранится исторический список владельцев велосипедов (Owners).

Используя Linq 2 SQL, я сгенерировал модель, которая дает мне сущность «Bike» с отношением 1 ко многим к «Owner», называемую «HistoricalOwners».

Пока все хорошо ...

Теперь у меня много запросов, где меня интересует текущий владелец. Текущий владелец является самой последней записью в таблице владельцев.

repo.Bikes().Where(b => b.HistoricalOwners.OrderByDescending(o => o.Date).First().Name == "Joe")

Это работает, но немного уродливо и не говорит, что я спрашиваю. Было бы неплохо создать свойство 'CurrentOwner' для моего объекта Bike и выполнить запрос к нему.

public Owner CurrentOwner
{
    get
    {
        return HistoricalOwners.OrderByDescending(o => o.Date).First();
    }
}    

Тогда я мог бы запросить вот так:

repo.Bikes().Where(b => b.CurrentOwner.Name == "Joe")

Это компилируется, но из курсов во время выполнения это не с:

У члена CurrentOwner нет поддерживаемого перевода в SQL.

Что имеет смысл.

Кто-нибудь знает, как я мог бы создать CurrentOwner таким образом, чтобы этот запрос работал?

Я провел некоторые исследования, чтобы заставить CurrentOwner возвращать дерево выражений вместо экземпляра, но я так и не получил того места, которое бы меня по-настоящему обрадовало.

Тогда я подумал, могу ли я добавить дополнительное отношение к моему репозиторию linq 2 sql для CurrentOwner и ограничить его соотношением один к одному. Но я не могу сделать это с linq 2 sql. Я думаю, что могу сделать это с сущностями Linq 2, но сейчас это не вариант.

У кого-нибудь есть идеи, как я могу заставить эту работу работать?

Заранее спасибо,

RMK

Ответы [ 2 ]

0 голосов
/ 29 октября 2010

Я не думаю, что вы действительно можете сделать это так, как вы хотите.

Мое предложение:

Создайте новый столбец базы данных, CurrentOwnerID, в таблице Bike, который является FK до OwnerID в таблице Owner. Отобразите это как ассоциацию в вашей модели, тогда вы можете запросить CurrentOwner так, как вы хотите.

Недостатком является то, что вам нужно управлять значением CurrentOwner, как для любого другого сопоставленного свойства - вы не можете получить его с помощью другого запроса, как в исходном примере, поэтому он может не подходить для вашего приложения.

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

0 голосов
/ 29 октября 2010

Вы пробовали:

public Owner CurrentOwner
{
    get
    {
        return HistoricalOwners.OrderByDescending(o => o.Date).FirstOrDefault();
    }
}  

чтобы увидеть, переводится ли это на SQL?

...