【发布时间】:2017-11-05 09:30:24
【问题描述】:
我有以下 asp.net 核心 LINQ 代码:
List<UserSearchResult> results = await db.ApplicationUsers.Where(u => u.Name.StartsWith(name) && !u.Deleted && u.AppearInSearch)
.OrderByDescending(u => u.Verified)
.ThenBy(u => u.DateAdded) // Added to prevent duplication of results in different pages
.Skip(page * recordsInPage)
.Take(recordsInPage)
.Select(u => new UserSearchResult()
{
Name = u.Name,
Verified = u.Verified,
PhotoURL = u.PhotoURL,
UserID = u.Id,
Subdomain = u.Subdomain
}).ToListAsync();
不幸的是,这会转化为以下内容:
SELECT [t].[Name], [t].[Verified], [t].[PhotoURL], [t].[Id], [t].[Subdomain] FROM ( SELECT [u0].* FROM [AspNetUsers] AS [u0] WHERE ((([u0].[Name] LIKE @__name_0 + N'%' AND (CHARINDEX(@__name_0, [u0].[Name]) = 1)) OR (@__name_0 = N'')) AND ([u0].[Deleted] = 0)) AND ([u0].[AppearInSearch] = 1) ORDER BY [u0].[Verified] DESC, [u0].[DateAdded] OFFSET @__p_1 ROWS FETCH NEXT @__p_2 ROWS ONLY ) AS [t]
我想知道为什么它有这个部分:
(CHARINDEX(@__name_0, [u0].[Name]) = 1)) OR (@__name_0 = N''))
不仅喜欢
非常感谢
【问题讨论】:
-
你应该用
entity-framework-core标记它。 #474 - Query: Improve translation of String's StartsWith, EndsWith and Contains 已对此进行了跟踪。已添加对本机 SQLLIke的 AFAIK 支持,并将在 v2 中提供 -
@IvanStoev 我已经修改了标签。我尝试升级到 2.0,但我无法单独为实体框架执行此操作,必须对整个 project.json 执行此操作,但出现了问题。你能建议一个替代方案吗?非常感谢。
-
v2 无论如何都没有正式发布。在那之前,不幸的是,我能想到的唯一解决方法(如果它对您很重要)是使用
db.ApplicationUsers.FromSql(...).OrderByDescending(...)....,即在 SQL 级别应用Where和LIKE,然后在 LINQ 中完成其余的工作:( -
@IvanStoev 非常感谢您的支持!但我担心这会将我的应用程序暴露给 SQL 注入,因为它使用原始 sql,你不这么认为吗?谢谢。
-
FromSql允许您使用参数,因此无需注入。我不喜欢它的原因是它破坏了 ORM 封装和数据库独立性,因此 :( 在我之前评论的末尾:) 同样,仅在关键时使用它。
标签: sql linq asp.net-core entity-framework-core