实体框架v4.1LIKE
本文关键字:1LIKE v4 框架 实体 | 更新日期: 2023-09-27 17:58:14
我必须如何构建查询才能生成输出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、实体框架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中直接使用"百分比"符号一样。
如果您想要完全的通配符支持,则必须使用ESQL。Linq to实体无法做到这一点,并且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<EntityType> query = new ObjectQuery<EntityType>(command, ctx);
ObjectResult<EtntiyType> result = query.Execute(MergeOption.AppendOnly);
如果使用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
var query = from viewRegister in context.ViewRegisters
where viewRegister.Name.Contains("yourname")
select viewRegister;