【问题标题】:Multiple clauses blocking the whole filter多个子句阻塞整个过滤器
【发布时间】:2021-12-28 11:46:39
【问题描述】:

我创建了一个大过滤器,它从我的前端获取数据,将其与数据库进行比较并返回正确的人。我的第一个问题是我认为我的解决方案不正确,因为后来我也需要和操作。我的 FilterByItem Clauses 也阻止了自己(在下面的代码中注释)。

我的过滤器如下所示:

//Login
[HttpPost("filter/")]
public async Task<IActionResult> Filter([FromBody] Filter user)
{
    //Variable für Personentypen als Liste machen
    return Ok(await _context
        .Personens
        //Obere Felder (nicht erweitert)
        .Where(p => p.Vorname.ToLower().Contains(user.vorname))
        .Where(p => p.Nachname.ToLower().Contains(user.nachname))
        .Where(p => p.Anrede.ToLower().Contains(user.anrede))
        .Where(p => p.Ort.ToLower().Contains(user.adresse) || p.Plz.Contains(user.adresse) ||
            p.Land.Contains(user.adresse) || p.Bundesland.Contains(user.adresse) ||
            p.Straße.Contains(user.adresse))
        .Where(p => p.Firmenbezeichnung.ToLower().Contains(user.firmenbezeichnung))
        .FilterByItems(user.personenTypFilter, (m, k) => m.Personentypzuordnungens.Any(i => i.Personentyp.Bezeichnung.Contains(k)), true) (Works if this is the only FilterByItems)
        //Merkmale
        //Fachtypen
        .FilterByItems(user.fachtypenFilter, (m, k) => m.Fachtypzuordnungens.Any(i => i.Fachtyp.Bezeichnung.Contains(k)), true) // If this one is not set in the frontend, the whole filter dont work anymore
        .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());
}

看来我需要一部分一部分地做,而不是像我做的那样,但我不知道我应该如何正确地做到这一点。

【问题讨论】:

  • p.Vorname.ToLower().Contains(user.vorname) 不能使用索引。您应该将列的排序规则更改为不区分大小写,然后进行正常比较

标签: .net linq entity-framework-core


【解决方案1】:

我会做这样的事情。我没有重构你的整个查询,但我给了你如何去做的想法:

 [HttpPost("filter/")]
    public async Task<IActionResult> Filter([FromBody] Filter user)
    {
        var baseQuery = _context.Personens.AsQueryable();
        if (!string.IsNullOrEmpty(user.vorname))
            baseQuery  = baseQuery.Where(p => p.Vorname.ToLower().Contains(user.vorname));
        if (!string.IsNullOrEmpty(user.nachname))
            baseQuery = baseQuery.Where(p => p.Nachname.ToLower().Contains(user.nachname));
        if (!string.IsNullOrEmpty(user.anrede))
            baseQuery  = baseQuery .Where(p => p.Anrede.ToLower().Contains(user.anrede))
....

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)
            }

【讨论】:

  • 这正是我想要的,我认为这是处理我的整个查询的更好方法!泰
  • 至少这似乎是另一个问题,因为 baseQuery.Where 他抛出了一个错误。 ibb.co/LzBN0xN
  • 什么样的错误?
  • 是的,我修好了。我添加了 .AsQueryable();
  • 现在工作正常,你能告诉我我如何处理像and这样的运算符吗?我不知道 && 和 ||将适用于我的情况。
猜你喜欢
  • 2015-11-06
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多