我們有一組具有以下類定義的用戶。
public class User
{
public Guid UserId { get;set; }
public Guid CompanyId { get;set; }
public Guid AddressTypeId { get;set; }
public Guid LocationId { get;set; }
public Guid DepartmentId { get;set; }
}
我們正在嘗試使用以下類定義查詢具有 companyId 的用戶串列,該串列與 LocationFilter 串列匹配。
public class LocationFilter
{
public Guid AddressTypeId { get;set; }
public ICollection<Guid> LocationIds { get;set; }
public ICollection<Guid> DepartmentIds { get;set; }
}
查詢 API 定義如下所示:
Task<List<User>> GetUserLocationList(
Guid companyId,
List<LocationFilter> locationFilters);
如果我們針對單個 LocationFilter 進行查詢,我有以下 Builder 查詢。
var companyIdFilter = Builders<User>.Filter
.Eq(user => user.CompanyId, companyId);
var addressTypeIdFilter = Builders<User>.Filter
.Eq(user => user.AddressTypeId, addressTypeId);
var locationIdFilter = Builders<User>.Filter
.In(user => user.LocationId, locationIds);
var departmentIdFilter = Builders<User>.Filter
.In(user => user.DepartmentId, departmentIds);
var andFilter = Builders<User>.Filter
.And(
companyIdFilter,
addressTypeIdFilter,
locationIdFilter,
departmentIdFilter);
var result = await collection.Find(andFilter).ToListAsync();
但是我們如何過濾一個 locationfilter 串列呢?每個 locationfilter 都是它自己的,它不能相交。例如,所有用戶都檢查了位置過濾器 A,然后檢查了位置過濾器 B 等。
我們如何使用構建器查詢來實作這一點?這是正確的方法嗎?
uj5u.com熱心網友回復:
您可以使用 anOr來組合位置過濾器以查找與(至少)其中一個過濾器匹配的任何用戶,例如(假設所有用戶都應該來自同一家公司):
public FilterDefinition<User> BuildLocationFilter(LocationFilter locFilter)
{
var addressTypeIdFilter = Builders<User>.Filter
.Eq(user => user.AddressTypeId, locFilter.AddressTypeId);
var locationIdFilter = Builders<User>.Filter
.In(user => user.LocationId, locFilter.LocationIds);
var departmentIdFilter = Builders<User>.Filter
.In(user => user.DepartmentId, locFilter.DepartmentIds);
var andFilter = Builders<User>.Filter
.And(
companyIdFilter,
addressTypeIdFilter,
locationIdFilter,
departmentIdFilter);
return andFilter;
}
public FilterDefinition<User> BuildCompanyAndLocationFilters(
Guid companyId,
IEnumerable<LocationFilter> locFilters)
{
var locFilterDefs =
Builders<User>.Filter.Or(locFilters.Select(x => BuildLocationFilter(x)));
return Builders<User>.Filter.Eq(x => CompanyId, companyId)
& locFilterDefs;
}
這將檢索滿足至少一個公司過濾條件的公司的所有用戶。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/509952.html
