实体框架v4.1 LIKE

时间:2011-06-01 13:35:51

标签: c# .net-4.0 entity-framework-4.1

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

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

OR

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

OR

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<T>)Data).Where(z => z.Field.Contains("a%b%c%"));

分为:

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

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

3 个答案:

答案 0 :(得分:7)

如果您需要完整的通配符支持,则必须使用ESQL。 Linq-to-entities无法首先执行此操作和EFv4.1代码(没有EDMX)doesn't have support for model defined functions因此无法使用@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<EntityType> query = new ObjectQuery<EntityType>(command, ctx);
ObjectResult<EtntiyType> result = query.Execute(MergeOption.AppendOnly);

答案 1 :(得分:4)

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

例如,以下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

答案 2 :(得分:1)

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