2008-11-18 2 views
6

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

E.g. Мой Person Тип объекта имеет следующие поля «ID», «Имя, отчество», «Фамилия», «DOB»

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

Forenames + " " + Surname 

Так я в конечном итоге с «ID», «Forename», «Surname», «DOB», «Fullname».

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

ответ

4

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

0

Craig,

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

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

+0

Как странно. Я сам проверял, что он не работает, и вот документация MSDN, которая говорит то же самое: http://msdn.microsoft.com/en-us/library/bb738638.aspx – 2008-11-21 13:36:03

2

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

3

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

Существует более актуальной и более DRY совместимом ответ здесь: Using a partial class property inside LINQ statement