entity frameworkv4.1 LIKE

如何构建我的查询以产生输出SQL查询,如:

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

要么

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

要么

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

我正在使用.Net Framework 4.0,Entity Framework v4.1和C#。

EF v4.1转换此类型的linq查询:

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

成:

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

那不是我想要的。 我希望能够像在DB中直接使用“百分比”符号一样。

如果需要完整的通配符支持,则必须使用ESQL 。 Linq-to-entities无法做到这一点,并且EFv4.1代码首先(没有EDMX) 不支持模型定义的函数,因此不能使用@Johann Blais提供的解决方案。

我想运行ESQL查询的代码可能如下所示:

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

如果您使用的是SQL Server,请使用PATINDEX函数进行模式搜索。 您可以使用SqlFunctions类通过EF访问此function。

例如,以下EF查询

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

将翻译成

 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 
 var query = from viewRegister in context.ViewRegisters where viewRegister.Name.Contains("yourname") select viewRegister;