2008-11-18 25 views
6

¿Alguien sabe si es posible crear una nueva propiedad en un tipo de entidad existente que se basa en otras 2 propiedades concatenadas?Linq a entidades y propiedades concatenas

E.g. Mi persona del tipo de entidad tiene estos campos "ID", "Nombre de pila", "Apellido", "fecha de nacimiento"

quiero crear un nuevo campo llamado "Nombre completo", que es

Forenames + " " + Surname 

Así termino con "ID", "Nombre de pila", "Apellido", "Fecha de nacimiento", "Nombre completo".

Sé que puedo hacer esto utilizando LINQ mediante programación, es decir,

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 
}; 

A continuación, llamar algo así como

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

Sin embargo realmente me gustaría utilizar LINQ a Entidades para hacer este trabajo para mí en el nivel del Modelo Conceptual.

Respuesta

4

Todavía no, pero tal vez pronto. En primer lugar, tenga en cuenta que su consulta sugerida no funcionará en absoluto en LINQ to Entities, con o sin la propiedad, porque, en este momento, no admite Contiene. Sin embargo, se supone que la nueva versión de Entity Framework en .NET 4.0 admite métodos personalizados en las consultas de LINQ to Entities. Puede ver a video about this from PDC. Básicamente, debes escribir el método personalizado dos veces; una vez en el código y una vez en su base de datos (por ejemplo, en un campo calculado). Vea el video para más información.

0

Craig,

Sarted de ver el video, entonces se dio cuenta de que es más de una hora, por lo que tendrá que verlo cuando tenga más tiempo. Sólo para hacerle saber, aunque .. Contiene parece estar funcionando bien para mí, aquí está el SQL que se genera por LINQ a Entidades:

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 

Parece que funciona un convite. Usando CHARINDEX de entrenamiento si el campo Concatinated contiene el texto introducido, que es el caso anterior era "de Dave".

Gracias a Dave

+0

Qué extraño. Me he verificado a mí mismo que no funciona, y aquí está la documentación de MSDN que dice lo mismo: http://msdn.microsoft.com/en-us/library/bb738638.aspx –

2

La razón Contiene "obras" para usted es porque usted está llamando String.Contains, y no IEnumerable.Contains, como pensaba Craig.