Linq to Entities и связанные свойства - PullRequest
6 голосов
/ 18 ноября 2008

Кто-нибудь знает, возможно ли создать новое свойство для существующего типа объекта, основанного на двух других свойствах, соединенных вместе?

например. Тип сущности My Person имеет следующие поля: «ID», «Имя», «Фамилия», «DOB»

Я хочу создать новое поле с именем «Полное имя», которое будет

Forenames + " " + Surname

Таким образом, я получаю «ID», «Имя», «Фамилия», «DOB», «Полное имя».

Я знаю, что могу сделать это с помощью Linq программно, т.е.

var results = from p in db.People
select new { 
ID = p.ID, 
Forename = p.Forename, 
Surname = p.Surname, 
DOB = p.DOB,
Fullname = p.Forename+ " " + p.Surname
};

Затем вызывать что-то вроде

var resultsAfterConcat = from q in results 
where q.Fullname.Contains(value)
select q;

Однако я бы очень хотел использовать Linq to Entities, чтобы выполнить эту работу для меня на уровне концептуальной модели.

Ответы [ 4 ]

4 голосов
/ 18 ноября 2008

Пока нет, но, возможно, скоро. Во-первых, обратите внимание, что предложенный вами запрос вообще не будет работать в LINQ to Entities со свойством или без него, поскольку в настоящее время он не поддерживает Contains. Однако предполагается, что новая версия Entity Framework в .NET 4.0 будет поддерживать пользовательские методы в запросах LINQ to Entities. Вы можете посмотреть видео об этом с PDC . По сути, вы должны написать пользовательский метод дважды; один раз в коде и один раз в вашей базе данных (например, в вычисляемом поле). Смотрите видео для получения дополнительной информации.

3 голосов
/ 26 января 2012

Для тех, кто собирается прочитать это через много лет после ответа на вопрос:

Здесь есть более актуальный и более DRY-совместимый ответ: Использование частичного свойства класса внутри оператора LINQ

2 голосов
/ 22 мая 2009

Причина, по которой Contains «работает» для вас, заключается в том, что вы вызываете String.Contains, а не IEnumerable.Contains, как думал Крейг.

0 голосов
/ 19 ноября 2008

Craig,

Начал смотреть видео, потом понял, что это более часа, так что придется смотреть его, когда у меня будет больше времени. Просто чтобы сообщить вам, хотя .. Содержит , кажется, работает хорошо для меня, вот SQL, который генерируется Linq для сущностей:

SELECT 
1 AS [C1], 
[Extent1].[PeopleID] AS [PeopleID], 
[Extent1].[Forenames] AS [Forenames], 
[Extent1].[Surname] AS [Surname]
FROM [dbo].[People] AS [Extent1]
WHERE (CHARINDEX(N'Dave', [Extent1].[Forenames] + N' ' + [Extent1].[Surname])) > 0

Кажется, это удовольствие. Использование CHARINDEX для тренировки, если поле Concatinated содержит введенный текст, который в вышеприведенном случае был " Dave ".

Спасибо Dave

...