【问题标题】:Search based on Properties基于属性搜索
【发布时间】:2020-02-11 18:15:40
【问题描述】:

我有一个 Employee 表,让我们假设 Columns -- Name, Age,Dept.

我需要根据条件进行搜索

  1. FIRST:姓名、年龄、部门完全匹配
  2. SECOND:完全匹配 + 完全匹配(任意两个完全匹配)
  3. 第三个:完全匹配

    如果找到第一个匹配,那么很好。如果没有匹配,那么我们需要去第二个选项,如果两个参数之间有任何匹配,我们需要找到结果。

注意:我正在寻找通用解决方案(想象一下我有要搜索的属性)

示例:EMP 表

如果用户正在搜索 "A" ,21 和 "CSC" 那么它是直截了当的,我可以编写类似的代码

context.Emp.Any(p => p.Name== "A"&& p.Age== 21&& p.Dept== "csc");

如果用户正在搜索“B”“19 " 和 "DDD" 然后我可以忽略 Dept DDD 并返回第二行,因为没有精确匹配,然后我只搜索两个属性匹配

【问题讨论】:

  • 向我们展示您到目前为止所做的尝试,但我们被您卡住了!您可能可以通过几个OR 条件来解决这个问题
  • 你看过 LINQ 吗?
  • 是的,我查看了 Linq,但如何进行通用搜索。我在想什么
  • 我投了反对票,因为我看不到自己尝试解决问题的努力,也没有任何提示您当前解决方案存在问题的地方。也没有代码可以重现您正在尝试的内容。请看How do I ask a good question
  • 但是如何进行通用搜索 → 您对通用的期望是什么?请解释输入和预期输出并分享一些例子。当前格式的问题不清楚。

标签: c#


【解决方案1】:

您可以根据匹配数计算分数,按分数排序并取第一个结果。像这样的东西应该可以工作:

var bestMatch = context.Emp.Select(
new {
    Score = (c.Age == age ? 1 : 0) + (c.Dept == dept ? 1 : 0) + (c.Name == name ? 1 : 0),
    Emp = c
}).OrderByDescending(c => c.Score).FirstOrDefault()?.Emp;

P.S.:您也可以直接按公式排序,而无需先将其选择到匿名对象中,但我喜欢上述方法的可读性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 2013-06-24
    • 2018-11-03
    • 2012-10-04
    相关资源
    最近更新 更多