在带有 Linq 的实体框架中使用 LIKE "%%%"? [复制]
Posted
技术标签:
【中文标题】在带有 Linq 的实体框架中使用 LIKE "%%%"? [复制]【英文标题】:Use LIKE "%%%" in Entity Framework with Linq? [duplicate]在带有 Linq 的实体框架中使用 LIKE "%%%"? [复制] 【发布时间】:2017-03-18 04:18:17 【问题描述】:我尝试向我的数据库发出请求,我想使用 SQL 中的“LIKE”运算符来解决此模式:%%%
使用“SQL 友好”语法。
目前我的请求如下所示:
var routelist = (from dbHost in db.Hosts
where dbHost.Host == host
join dbRoute in db.Route on dbHost.HostsId equals dbRoute.HostId
select dbRoute).ToList();
如果有人知道怎么做,他可以告诉我吗?谢谢
编辑:
我想做类似的事情:
var routelist = (from dbHost in db.Hosts
where dbHost.Host == host
join dbRoute in db.Route on dbHost.HostsId equals dbRoute.HostId
where dbRoute.alias like "%%%"
select dbRoute).ToList();
【问题讨论】:
您是否在 linq 中搜索通配符?在这种情况下,这可能会对您有所帮助:***.com/questions/1040380/wildcard-search-for-linq @Mickey 我认为这就是我要寻找的,但是这种方式是否经过优化?是只过滤请求结果还是只选择数据库中的正确字段? 【参考方案1】:Entity Framework Core 2.0 现在有可用的EF.Functions
属性,其中包括EF.Functions.Like()
。
https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-entity-framework-core-2-0/
例子:
var customers =
from c in context.Customers
where EF.Functions.Like(c.Name, "a%");
select c;
【讨论】:
【参考方案2】:当我需要使用实体框架执行此类 LIKE 查询时(这种情况很少发生,因为此类查询通常不能使用任何索引,因此执行全表扫描并且在大表上非常慢),我使用 PATINDEX
,像这样:
var routelist = (from dbHost in db.Hosts
where dbHost.Host == host
join dbRoute in db.Route on dbHost.HostsId equals dbRoute.HostId
where SqlFunctions.PatIndex("%%%",dbRoute.alias) > 0
select dbRoute).ToList();
sql server 中PATINDEX
函数类似于LIKE,但返回第一个匹配的位置。
如果你想以 "%something%" 的形式执行 LIKE 查询,你可以使用 Contains("something")。如果它具有“%something”的形式 - 使用 StartsWith("something")。如果它的形式是 "something%" - 使用 EndsWith("something")。
【讨论】:
这似乎正是我所需要的,但它似乎也不存在于 ASP.NET Core 上(实际上,System.Data.Object 似乎不存在)跨度> 没错,没有注意到它与 EF Core 有关。好吧,那里尚不支持此类功能(不确定如何将其用于当前状态下的任何严重问题)。您可以尝试使用 FromSql 的解决方法,如下所述:github.com/aspnet/EntityFramework/issues/3325以上是关于在带有 Linq 的实体框架中使用 LIKE "%%%"? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
带有存储过程的实体框架 VS LINQ to SQL VS ADO.NET? [关闭]