【发布时间】:2021-12-29 03:44:26
【问题描述】:
我正在构建一个过滤器并使用FilterByItems 方法比较两个数组(一个来自我的前端,一个来自我的数据库)。这一切都通过我前端的覆盖面板进行,用户可以在其中选择不同的人员类型,如成员、工人等等。所以我的问题是现在我有多个不想一起工作的人型悬停。如果我只有一个它可以正常工作,如果我添加第二个它只有在前端列表中具有相同的值时才有效。
正确的情况是: 前端面板一得到了数组中的成员,前端面板二得到了数组中的朋友。 表格显示了在其个人资料中使用这些类型保存的所有人员。
当前和错误的情况是: 面板 1 和面板 2 不使用不同的数组,并且仅在两者具有相同列表时才显示信息,例如都在位置 [0] 上获得成员
一般来说,它看起来像一个单独的查询和查询,并且当第二个面板加入它时,它会完全阻塞。所以这是我的代码(FilterByItems 方法在上面链接):
//The Filter
//Login
[HttpPost("filter/")]
public async Task<IActionResult> Filter([FromBody] Filter user)
{
var baseQuery = _context.Personens.AsQueryable();
//Personentyp 1 Dont works in combination with below
if (user.personenTypFilter.Length > 0)
baseQuery = baseQuery.FilterByItems(user.personenTypFilter, (m, k) => m.Personentypzuordnungens.Any(i => i.Personentyp.Bezeichnung.Contains(k)), true);
////Personentyp 2
//if (user.personenTypFilter2.Length > 0)
// baseQuery = baseQuery.FilterByItems(user.personenTypFilter2, (m, k) => m.Personentypzuordnungens.Any(i => i.Personentyp.Bezeichnung.Contains(k)), true);
//---------------------------------
var result = await (baseQuery.Select(p => new
{
personId = p.PersonId,
nachname = p.Nachname,
vorname = p.Vorname,
plz = p.Plz,
firmBez = p.Firmenbezeichnung,
ort = p.Ort,
personentyp = p.Personentypzuordnungens.Select(i => new
{
personentypId = i.PersonentypId,
}),
aktuellePosition = p.AktuellePosition,
taetigkeit = p.Tätigkeit,
kernkompetenzen = p.Kernkompetenzen,
datenReviewedZeitpunkt = p.DatenReviewedZeitpunkt,
}).ToListAsync());
return Ok(result);
}
这就是我在过滤器模型中声明变量的方式:
public string[] personenTypFilter { get; set; }
public string[] personenTypFilter2 { get; set; }
.CombineAnd(来自 cmets)的新问题
baseQuery = baseQuery.Where(
//Characteristics
character1Predicate.CombineOr(character1Predicate2).CombineOr(character1Predicate3)
//Persontypes
.CombineAnd(personType1Predicate.CombineOr(personType2Predicate).CombineOr(personType3Predicate)));
【问题讨论】:
-
所以你需要示意图
baseQuery.FilterByItems(user.personenTypFilter, ..,) || baseQuery.FilterByItems(user.personenTypFilter2, ..,)? -
是的,我想是的。我也已经这样尝试过了,但出现错误:“ || 不能应用于 IQueryable
和 IQueryable 类型的操作数” -
当然不能。我需要改进
FilterByItems- 这是我的职责。 -
哦哈哈哇,那太好了!
-
不是真的,它有
PredicateBuilder在这里可能会有所帮助,但我可以在没有这种依赖的情况下做到这一点。