首页 > 解决方案 > 仅当不为空时才包含在 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 中返回任何内容

标签: c#entity-framework-core

解决方案


您可以使用多个.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);

推荐阅读