我有一個這樣的 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。
任何幫助,將不勝感激。
uj5u.com熱心網友回復:
這可能不是您現在想要的答案,但您可能會回頭看,并在以后將其視為正確答案。
您的 ORM(可能是物體框架)無法將您的 Linq 運算式轉換為查詢。如果您的專案將有一個小型資料庫,并且您不需要查詢性能良好,那么請調整您的運算式,以便 ORM 可以生成一個正常運行的查詢,盡管不是最佳的查詢。
如果資料將是您專案的重要組成部分,那么請切換到像Dapper這樣的輕型 ORM并學習資料庫的查詢語言。用該查詢語言撰寫最佳的引數化查詢并產生長期收益。
uj5u.com熱心網友回復:
雖然理論上可以將此條件轉換為 SQL,但您的 EF Core 版本不支持。在定義自定義投影之前考慮制作過濾器:
var users = _context.Users.AsQueryable();
if (!string.IsNullOrEmpty(searchText))
users = users.Where(x => x.Username.Contains(searchText) || x.Roles.Any(r => r.Contains(searchText)));
var data =
from user in 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()
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/336808.html
上一篇:在陣列python中創建陣列
