2011-06-01 13 views
8

? ¿Cómo tengo que construir mi consulta para dar lugar a una consulta SQL salida como:Entity Framework v4.1 COMO

SELECT 
[viewRegisters].[Id] AS [IdRegister] 
WHERE Name LIKE '%a%bc' 

O

SELECT 
[viewRegisters].[Id] AS [IdRegister] 
WHERE Name LIKE 'a%b%c' 

O

SELECT 
[viewRegisters].[Id] AS [IdRegister] 
WHERE Name LIKE 'a%b%c%' 

I Estoy usando .Net Framework 4.0, Entity Framework v4.1 y C#.

EF v4.1 convierte este tipo de consultas LINQ de:

((IQueryable<T>)Data).Where(z => z.Field.Contains("a%b%c%")); 

En:

SELECT 
[viewRegisters].[Id] AS [Id] 
WHERE Name LIKE N'a~%b~%c~%' ESCAPE N'~' 

Eso no es lo que quiero. Quiero poder usar el símbolo de 'porcentaje' como lo hago directamente en DB.

+0

Por lo general se traduce en una .Contains Como –

Respuesta

1
var query = from viewRegister in context.ViewRegisters 
where viewRegister.Name.Contains("yourname") 
select viewRegister; 
7

Debe utilizar ESQL si desea compatibilidad total con comodines. Linq-to-entities no puede hacer eso y el código EFv4.1 primero (sin EDMX) doesn't have support for model defined functions por lo que la solución proporcionada por @Johann Blais no se puede usar.

supongo que el código para ejecutar la consulta ESQL puede verse como:

string command = "SELECT VALUE e FROM ContextName.DbSetName AS e WHERE e.Field LIKE 'a%b%c%'" 
ObjectContext ctx = ((IObjectContextAdapter)dbContext).ObjectContext; 
ObjectQuery<EntityType> query = new ObjectQuery<EntityType>(command, ctx); 
ObjectResult<EtntiyType> result = query.Execute(MergeOption.AppendOnly); 
+1

¿Hay una manera de utilizar que, en combinación con PredicateBuilder ? – Gil

4

Si está utilizando SQL Server, utilice la función PATINDEX hacer una búsqueda de patrones. Puede acceder a esta función a través de EF utilizando la clase SqlFunctions.

Por ejemplo, la siguiente consulta EF

context.ViewRegisters.Where(z => SqlFunctions.PatIndex("a%b%c%", z.Name) > 0); 

se traducirá en

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Name] AS [Name] 
FROM [dbo].[ViewRegisters] AS [Extent1] 
WHERE (CAST(PATINDEX(N'a%b%c%', [Extent1].[Name]) AS int)) > 0 
+0

Voy a intentar con esto, el problema que veo es que la cadena de patrones necesita desinfectarse (para la inyección de sql). –

+0

Intenté esto en el servidor SQL y en el código EF y obtuve un gran error en todo momento. ¡Devolvió todos los resultados en la tabla! – Matt