【发布时间】:2021-02-22 16:40:48
【问题描述】:
为警告生成错误
'Microsoft.EntityFrameworkCore.Query.QueryClientEvaluationWarning: 无法翻译 LINQ 表达式 'where Convert([p].Status, Enum).GetDisplayName().Contains(__searchBy_8)' 并将在本地进行评估。'。可以通过传递事件 ID 抑制或记录此异常 'RelationalEventId.QueryClientEvaluationWarning' 到 'DbContext.OnConfiguring' 或 'AddDbContext' 中的 'ConfigureWarnings' 方法。
我正在将状态枚举的值保存到数据库表Complaints
public enum Status
{
Pending = 0,
Error = 1,
Cancelled = 2,
Delayed = 3,
Resolved = 4
}
我必须对搜索字符串的查询应用过滤以及其他一些过滤,我正在尝试按以下方式执行此操作
// Apply Relevant SearchModel filters first
var query = context.Complaints
.Include(s => s.Messages)
.ThenInclude(p => p.User).AsQueryable();
if (dtParams.StartDate != null && dtParams.EndDate != null)
{
query = query.Where(s => s.CreatedAt >= dtParams.StartDate.Value.Date &&
s.CreatedAt <= dtParams.EndDate.Value.Date);
}
string searchBy = dtParams.Search?.Value;
if (!string.IsNullOrEmpty(searchBy))
{
query = query.Where(r => r.ComplaintNo.Contains(searchBy) ||
r.CreatorUsername.Contains(searchBy) ||
(r.CreatedAt != null && r.CreatedAt.ToString().Contains(searchBy)) ||
(r.Status.GetDisplayName().Contains(searchBy)) ||
r.Messages.Any(p => p.StatusDescription.Contains(searchBy))
);
}
// Convert the Db context to Custom ViewModel which will then be rendered on to a DataTable
var dtQuery = query.SelectMany(x => x.Messages, (complaint, message) => new { complaint, message })
.Select(p => new ListTableViewModel
{
ComplaintNo = $"<a href=\"{Url.Action("GetLabels", new { orderNo = p.complaint.ComplaintNo })}\" target=\"_blank\"> {p.complaint.ComplaintNo}</a>",
Tracking = GenerateTrackingUrl(p.complaint),
Creator = p.complaint.CreatorUsername,
CreatedAt = p.complaint.CreatedAt.ToString("dd/MM/yy"),
Status = $"<span class=\"badge label-{p.complaint.Status}\">{p.complaint.Status.GetDisplayName()}</span>",
Info = p.message.StatusDescription
}).ToList();
我遇到了如下异常
为警告“Microsoft.EntityFrameworkCore.Query.QueryClientEvaluationWarning:
生成错误 无法翻译 LINQ 表达式 'where Convert([p].Status, Enum).GetDisplayName().Contains(__searchBy_8)' 并将在本地进行评估。'。通过将事件 ID 'RelationalEventId.QueryClientEvaluationWarning' 传递给 'DbContext.OnConfiguring' 或 'AddDbContext' 中的 'ConfigureWarnings' 方法,可以抑制或记录此异常。
导致此异常的行是我将搜索文本与枚举值进行比较的地方
(r.Status.GetDisplayName().Contains(searchBy))
如果有人正在搜索文本 Resolved ,我如何将枚举的显示名称与搜索字符串进行比较,我必须从 db 中获取 Status Resolved 的所有记录
【问题讨论】:
标签: .net entity-framework linq enums