2011-06-01 3 views
8

Comment dois-je construire ma requête pour aboutir à une sortie requête SQL comme:Entity Framework v4.1 COMME

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

OU

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

OU

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

I J'utilise .Net Framework 4.0, Entity Framework v4.1 et C#.

EF v4.1 convertit ce type de requêtes 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'~' 

Ce n'est pas ce que je veux. Je veux être capable d'utiliser le symbole 'pourcentage' comme je le fais directement dans DB.

+0

Habituellement .Contains résultats dans un –

Répondre

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

Vous devez utiliser ESQL si vous voulez un support générique complet. Linq-to-entities n'est pas capable de faire cela et le code EFv4.1 est le premier (sans EDMX) doesn't have support for model defined functions donc la solution fournie par @Johann Blais ne peut pas être utilisée.

Je suppose que le code à exécuter la requête ESQL peut ressembler à:

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

Comme Y at-il un moyen d'utiliser qu'en combinaison avec PredicateBuilder ? – Gil

4

Si vous utilisez SQL Server, utilisez la fonction PATINDEX pour effectuer une recherche de modèle. Vous pouvez accéder à cette fonction via EF en utilisant la classe SqlFunctions.

Par exemple, la requête suivante

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

traduirons 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 
EF
+0

Je vais essayer avec ceci, le problème que je vois est que la chaîne de modèle doit être assainie (pour l'injection sql). –

+0

J'ai essayé ceci sur le serveur SQL et dans le code EF et j'ai eu un gros gros problème à chaque fois. Il a retourné tous les résultats dans la table! – Matt