【问题标题】:What is the best way to search data on multiple fields [duplicate]在多个字段上搜索数据的最佳方法是什么[重复]
【发布时间】:2018-06-30 19:02:54
【问题描述】:

我在 ASP.NET MVC 中工作,我有一个场景,用户可以选择多个选项来获取医生列表,这就是我的操作的样子。

public JsonResult DoctorsList(int? specialization , int? city, int? area, int? insurance_company, string doctor_name )

这些参数中的任何一个都可以有一些值,并且它们中的任意数量都可以为空,也可以全部为空,因为我将返回所有记录。 现在我知道了一种漫长而复杂的方法,我可以对这些参数进行不同的组合,并检查哪个为空,哪个不是,然后根据它编写我的查询。 但是还有其他更短更有效的方法吗? 现在我正在使用 OR 条件来获取这样的记录

            var doctors = db.Doctors.Where(e =>
        e.specialization == specialization ||
        e.Clinics.FirstOrDefault(cs => cs.doctor_id == e.doctor_id).Area.city_id == city ||
        e.Clinics.FirstOrDefault(cs => cs.doctor_id == e.doctor_id).area_id == area ||
        e.Clinics.FirstOrDefault(cs => cs.doctor_id == e.doctor_id).ClinicInsuranceCompanies
        .Select(sin=>sin.company_id).ToList().Contains(insurance_company) ||
        e.first_name == doctor_name ||
        e.last_name == doctor_name
        )
        .Select(s => new
        {
            doctor_name = s.first_name + " " + s.last_name
        }).ToList();

但我希望它可以组合使用,例如选择具有 specialization_id = 1 和 city_id=2 的医生,以及其他类似的组合。但如果只有一个条件匹配,OR 条件将为真

【问题讨论】:

  • 您可以发布您从中选择所有记录的查询吗?
  • 更新了我的问题
  • 我添加了一个答案检查是否适合你

标签: c# asp.net-mvc entity-framework search


【解决方案1】:

对于您的情况,我认为这种方法可能会起作用,而不是在其他情况下四处走动。我认为 && 应该用来准确过滤掉,但你可以使用 ||运算符,如果这就是你想要的,

var doctors = db.Doctors.Where(e =>
                (specialization != null && e.specialization == specialization) &&
                (city != null && e.Clinics.FirstOrDefault(cs => cs.doctor_id == e.doctor_id).Area.city_id == city) &&
                (area != null && e.Clinics.FirstOrDefault(cs => cs.doctor_id == e.doctor_id).area_id == area) &&
                (insurance_company != null && e.Clinics.FirstOrDefault(cs => cs.doctor_id == e.doctor_id).ClinicInsuranceCompanies
                .Select(sin => sin.company_id).ToList().Contains(insurance_company)) &&
                (doctor_name != "" && e.first_name == doctor_name || e.last_name == doctor_name)
                )
                .Select(s => new
                {
                    doctor_name = s.first_name + " " + s.last_name
                }).ToList();

【讨论】:

  • 这使得!= null 成为 SQL 查询的一部分,这可能会严重扰乱查询计划并降低性能。最好有条件地添加谓词。
  • 哦,我不知道,但是要花很多时间来有条件地检查并为每个查询运行不同的查询吗?
  • 你的回答给了我一个提示,我想通了,我已经发布了回复。我想要这样的东西,Todoo Todoo
【解决方案2】:

这就是我要找的@imanshu15 答案给了我一个提示。

            var doctors = db.Doctors.Where(e =>
        (specialization != null && e.specialization == specialization) || (specialization == null)
        ).Where(e =>
        (city != null && e.Clinics.FirstOrDefault(cs => cs.doctor_id == e.doctor_id).Area.city_id == city) || (city == null)
        ).Where(e =>
        (area != null && e.Clinics.FirstOrDefault(cs => cs.doctor_id == e.doctor_id).area_id == area) || (area == null)
        ).Where(e =>
        (insurance_company != null && e.Clinics.FirstOrDefault(cs => cs.doctor_id == e.doctor_id).ClinicInsuranceCompanies
            .Select(sin => sin.company_id).ToList().Contains(insurance_company)) || (insurance_company == null)
        ).Where(e =>
        (doctor_name != null && e.first_name == doctor_name) || (doctor_name == null)
        )

【讨论】:

  • @Shahir 为什么在可以使用 && 运算符时运行多个 Where 子句? .如果答案是有帮助的,请投票
  • 正如我在另一个答案下面所说:这可能有害。您应该查看可能的重复项。
  • 顺便说一句,谓词包含冗余:(specialization != null && e.specialization == specialization) || (specialization == null)可以简化为(specialization == null || e.specialization == specialization)
  • @imanshu15 && 运算符将结果集设为 null 如果其中任何一个为 false 我的场景是用户可以选择任何搜索选项或无 .. 我投票了,但我在 stackoverflow 上的排名让我投票不可见。
  • @GertArnold 谢谢哥们,我会把它改成这个(y)
猜你喜欢
  • 2014-10-25
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 2016-08-21
  • 1970-01-01
  • 2011-03-28
  • 2010-09-14
相关资源
最近更新 更多