You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于属性匹配得分,如何用C#/SQL匹配产品与最优条件?

实现产品与条件的匹配排序(SQL/C#方案)

需求说明

我们有Products和Conditions两张表,一个产品可对应多个条件,需要计算每个产品对应条件的匹配得分(4个属性各占25分,总分0-100),并按得分从高到低排序。

SQL实现方案

直接在数据库层面计算得分,效率更高,适合数据量较大的场景。

全量匹配排序SQL

SELECT
    p.Id AS ProductId,
    c.Id AS ConditionId,
    -- 逐个属性判断匹配,累加得分
    (
        CASE WHEN p.Property1 = c.Property1 THEN 25 ELSE 0 END
        + CASE WHEN p.Property2 = c.Property2 THEN 25 ELSE 0 END
        + CASE WHEN p.Property3 = c.Property3 THEN 25 ELSE 0 END
        + CASE WHEN p.Property4 = c.Property4 THEN 25 ELSE 0 END
    ) AS MatchScore
FROM Products p
CROSS JOIN Conditions c
ORDER BY p.Id, MatchScore DESC;

仅获取每个产品的最高匹配条件

如果只需要每个产品得分最高的条件,用窗口函数筛选:

WITH ProductConditionScores AS (
    SELECT
        p.Id AS ProductId,
        c.Id AS ConditionId,
        (
            CASE WHEN p.Property1 = c.Property1 THEN 25 ELSE 0 END
            + CASE WHEN p.Property2 = c.Property2 THEN 25 ELSE 0 END
            + CASE WHEN p.Property3 = c.Property3 THEN 25 ELSE 0 END
            + CASE WHEN p.Property4 = c.Property4 THEN 25 ELSE 0 END
        ) AS MatchScore,
        ROW_NUMBER() OVER (PARTITION BY p.Id ORDER BY 
            (
                CASE WHEN p.Property1 = c.Property1 THEN 25 ELSE 0 END
                + CASE WHEN p.Property2 = c.Property2 THEN 25 ELSE 0 END
                + CASE WHEN p.Property3 = c.Property3 THEN 25 ELSE 0 END
                + CASE WHEN p.Property4 = c.Property4 THEN 25 ELSE 0 END
            ) DESC) AS Rank
    FROM Products p
    CROSS JOIN Conditions c
)
SELECT ProductId, ConditionId, MatchScore
FROM ProductConditionScores
WHERE Rank = 1;

C#实现方案

适合需要在应用层自定义匹配逻辑的场景,先拉取数据到内存再计算。

核心代码示例

// 实体类定义
public class Product
{
    public int Id { get; set; }
    public short? Property1 { get; set; }
    public short? Property2 { get; set; }
    public string Property3 { get; set; }
    public string Property4 { get; set; }
}

public class Condition
{
    public int Id { get; set; }
    public short? Property1 { get; set; }
    public short? Property2 { get; set; }
    public string Property3 { get; set; }
    public string Property4 { get; set; }
}

public class ProductConditionMatch
{
    public int ProductId { get; set; }
    public int ConditionId { get; set; }
    public int MatchScore { get; set; }
}

// 计算匹配得分并排序
public List<ProductConditionMatch> GetSortedMatches(List<Product> products, List<Condition> conditions)
{
    var matches = new List<ProductConditionMatch>();
    
    foreach (var product in products)
    {
        foreach (var condition in conditions)
        {
            int score = 0;
            if (product.Property1 == condition.Property1) score += 25;
            if (product.Property2 == condition.Property2) score += 25;
            if (product.Property3 == condition.Property3) score += 25;
            if (product.Property4 == condition.Property4) score += 25;
            
            matches.Add(new ProductConditionMatch
            {
                ProductId = product.Id,
                ConditionId = condition.Id,
                MatchScore = score
            });
        }
    }
    
    return matches.OrderBy(m => m.ProductId).ThenByDescending(m => m.MatchScore).ToList();
}

方案选择建议

  • 数据量大时优先选SQL方案,利用数据库计算能力减少应用层内存占用
  • 需要复杂匹配逻辑(如模糊匹配、权重调整)时选C#方案,灵活度更高

内容的提问来源于stack exchange,提问作者Mivaweb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:05:19