如何创建兼容EF Core的参数化函数表达式以筛选用户实体
按多字段筛选用户实体的实现与误解澄清
需求背景
需要按名称类字段筛选AuthenticatedUserModel实体,涉及UPN、登录名、显示名、邮箱等多种类型字段,因此将冗长的筛选逻辑提取为一个接收搜索字符串、返回Expression<Func<AuthenticatedUserModel, bool>>的委托。
筛选逻辑实现代码
public Func<string, Expression<Func<AuthenticatedUserModel, bool>>> MatchByName => filter => x => x.StatusId != StatusId.Deleted && x.StatusId != StatusId.Unprepped && SupportedRecordTypes.Contains(x.RecordType) && x.LogonName.ToLower().Contains(filter.ToLower()) && x.DisplayName.ToLower().Contains(filter.ToLower()) && x.Email.ToLower().Contains(filter.ToLower()) && x.Upn.ToLower().Contains(filter.ToLower());
查询调用代码
public IQueryable<UsernameResponse> GetNamesLike(string filter) { return _dbContext.AuthenticatedUsers .Where(MatchByName(filter)); }
常见误解澄清
最初误以为EF Core执行查询时filter参数为空,查看生成的SQL后发现是误解:搜索字符串会作为参数传递,SQL主体中显示的N''只是参数占位符,实际参数值是正确的。
内容的提问来源于stack exchange,提问作者Kyoshiro Kokujou Obscuritas
相关产品推荐
相关产品推荐

