【问题标题】:Entity Framework v4.1 LIKE实体框架 v4.1 LIKE
【发布时间】:2011-06-01 13:35:50
【问题描述】:

如何构建我的查询以产生如下输出 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<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 中那样使用“百分比”符号。

【问题讨论】:

  • 通常 .Contains 成赞

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


【解决方案1】:

如果您想要完整的通配符支持,您必须使用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);

【讨论】:

  • 有没有办法将它与 PredicateBuilder 结合使用?
【解决方案2】:

如果您使用的是 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

【讨论】:

  • 我会试试这个,我看到的问题是模式字符串需要清理(用于 sql 注入)。
  • 我在 SQL Server 和 EF 代码中尝试过这个,每次都失败了。它返回了表中的每一个结果!
【解决方案3】:
var query = from viewRegister in context.ViewRegisters
where viewRegister.Name.Contains("yourname")
select viewRegister;

【讨论】:

    猜你喜欢
    • 2013-03-17
    • 2022-11-08
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2017-07-07
    • 2020-04-11
    • 1970-01-01
    相关资源
    最近更新 更多