c# - Entity Framework 通配符和 Linq

标签 c# linq entity-framework odac

是否可以构建包含通配符的有效 Linq 查询?

我看到了这个问题的各种答案,建议使用:

.Where(entity => entity.Name.Contains("FooBar"))
.Where(entity => entity.Name.EndsWith("Bar")) 
.Where(entity => entity.Name.StartsWith("Foo"))

或构建 RawSql:

var commandText =
    @"SELECT field
    FROM     table
    WHERE    field LIKE @search";

var query = new ObjectQuery<Profile>(commandText, context);
query.Parameters.Add(new ObjectParameter("search", wildcardSearch));

如果通配符不在字符串的开头或结尾,例如 searchTerm = "Foo%Bar",第一个解决方案将不起作用。

第二种解决方案,使用 RawSql,不适合我,感觉像是一种廉价的出路。但它确实有效。

我尚未尝试的第三个选项是创建可以解析搜索词并构建有效 Linq 查询的东西,这是@Slauma 在下面的链接 2 中尝试过的东西。但如果通配符不在搜索词的开头或结尾,这仍然行不通。

那么问题来了:是否可以构造一个包含通配符的有效 Linq 查询?

编辑: 值得一提的是,在本例中我使用的是 Oracle 数据访问组件 (ODAC/ODP),但我认为在本例中没有太大区别。

links:

1. “like” queries in Entity Framework

2。 exact and wildcard searching conditional on search term

3。 Using RawSql

最佳答案

如果您使用 EDMX 文件作为实体模型的基础,那么也许您可以尝试创建一个 Conceptual Model Function,然后在 SQL 中执行 LIKE。我不确定这是否适用于 Oracle。然后您应该能够执行以下操作:

.Where(entity => Like(entity.Name, "Foo%Bar"))

关于c# - Entity Framework 通配符和 Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17723098/

相关文章:

entity-framework - EF Core 内连接而不是左连接

c# - 使用服务器变量进行身份验证

c# - 一个用于连接具有相同接口(interface)的两个不同对象列表的衬垫

c# - 如何获取字典中的前 N ​​个(百分比)值?

c# - 为 IList 优化 LINQ

c# - 使用 Entity Framework 同时更新和添加子行

c# - RSA 加密,长度变差

c# - DllNotFoundException:libzmq

c# - C# 中的项目属性

c# - Entity Framework 4 与 SQL CE 4 问题