【发布时间】:2021-12-11 15:22:48
【问题描述】:
我有一个这样的 LINQ 查询:
var data = from user in _context.Users
select new
{
UserId = user.Id,
Username = user.UserName,
RoleNames = (from userRole in _context.UserRoles
join role in _context.Roles on userRole.RoleId
equals role.Id
where userRole.UserId == user.Id
select role.Name).ToList()
};
if (!string.IsNullOrEmpty(searchText))
data = data.Where(x => x.Username.Contains(searchText) || x.RoleNames.Any(r => r.Contains(searchText)));
结果是这样的:
User Id | Username | RoleNames
1 | Matt | [User, Admin]
2 | Jennifer | [User]
3 | John | []
但是
x.RoleNames.Any(r => r.Contains(searchText))
不工作,导致 InvalidOperationException:无法翻译 LINQ 表达式“...”。
我想传入一个 searchText 来搜索“用户名”和“角色名称”列。 例如。如果我传入 searchText = 'Jen' 它将返回用户 ID 2,如果我传入 searchText = 'user' 它将返回用户 ID 1 和 2。
任何帮助将不胜感激。
【问题讨论】:
-
你有导航属性
User.Roles,或者类似的吗? -
我猜
Users不是一个简单的IEnumerable,_context是一个DbContext,而您正在使用像实体框架这样的ORM。问题是,您的 ORM 不知道如何将您的 Lambda 表达式转换为数据库查询,所以这实际上不是 Linq 问题。 -
您使用的是什么 LINQ:LINQ to Objects / SQL / EF 6.x / EF Core 2.0 / 2.1 / 3.x / 5.x / 6.x?什么数据库提供商?
-
使用LINQKit,您可以使用 Predicate Builder 构建可翻译的表达式。
-
@NetMage,这里没有任何帮助。自定义投影使得在谓词中重用集合变得困难。
标签: asp.net list entity-framework linq asp.net-core