c# - 仅当不为空时才包含在 where 语句中
问题描述
我有以下内容:
仅当过滤器不为空时,如何在 where 语句中包含过滤器?我尝试了以下,但我总是得到 0 条记录
public async Task<IList<UserRefDto>> GetUserRef(Dictionary<string, string> filter) {
var iod = 549; // a test user who has 2548 records in db
var favorites = filter.ContainsKey("fav") ? filter["fav"].ConvertToGuid(",") : null;
var histories = filter.ContainsKey("his") ? filter["his"].ConvertToGuid(",") : null;
var orders = filter.ContainsKey("ord") ? filter["ord"].ConvertToGuid(",") : null;
var result = await context.UserRefernces
.Where(x =>
x.User_iod = iod
&& (favorites != null && favorites.Contains((Guid)x.FavId))
&& (histories != null && histories.Contains((Guid)x.HistoryId))
&& (orders != null && orders.Contains((Guid)x.OrderId))
)
.AsNoTracking()
.ToListAsync()
.ConfigureAwait(false);
return result;
}
编辑 注意:如果所有键都有值,那么我会返回记录,只有当一个或多个为空时,我才能从 db 中返回任何内容
解决方案
您可以使用多个.Where()
语句构建查询,这些语句将通过AND
条件添加。.Where()
但仅当值存在时才添加附加语句。
var query = context.UserRefernces
.Where(x => x.User_iod == iod);
if (favorites != null) {
query = query.Where(x => favorites.Contains((Guid)x.FavId));
}
// same for "histories" and "orders"
var result = await query
.AsNoTracking()
.ToListAsync()
.ConfigureAwait(false);
推荐阅读
- ios - 使用 Xcode 的预处理设置 info.plist 键和值
- performance - GTmetrix 测试的页面加载时间差异
- excel - Python3.x:TypeError:预期的 str、bytes 或 os.PathLike 对象,而不是列表
- python - 在 powershell 中使用 python manage.py migrate 命令时,我收到以下错误消息
- css - 离子如何在图像旁边添加按钮
- python - python sum(list) 和 reduce(lambda x, y : x+y, list) 之间的差异?
- javascript - Vue.js,Express Server,Okta,部署到 Heroku,隐式/回调 404
- jquery - 填充所有行但显示“1 个条目中的 1 个”的数据表
- ssl - 子域的 SSL 证书
- android - 序列化时数据占用不能超过10240KB [android-workmanager]