是否可以计算 linq to Entity Framework 中一行满足的条件数

Is it possible to count the number of condition a row have satisfied in linq to Entity Framework

我想知道是否有一种方法可以计算一行满足的条件数,以便根据满足大部分条件的条件对 return 值进行排序。

假设 table 是这样的:

假设条件是 size=Mcolor=bluesize<40

我期望的结果是这样的:

Id3 (3 conditions)
Id4 (2 conditions)
Id1 (1 condition)
Id2 (1 condition)

这是使用 linq 实现条件聚合的一种方法。

请注意,我不得不稍微调整一下你的条件,因为你写了 size=M or color=blue or size<40 - 但 size 要么是一个字符串,要么是一个数字,不可能两者都是 - 所以我认为这是一个错字它应该是 size=M or color=blue or value<40.

此外,由于您没有提供 MCVE,我为您提供了(尝试为您的下一个问题创建一个 MCVE)

所以让我们从一个简单的 class 数据开始:

class Data
{
    public Data(string id, string size, int value, string color)
    {
        Id = id;
        Size = size;
        Color = color;
        Value = value;
    }

    public string Id {get;set;}

    public string Size {get;set;}

    public int Value {get;set;}

    public string Color {get;set;} 

    public override string ToString()
    {
        return string.Format("Id = {0}, Size = {1}, Value = {2}, Color = {3}", Id, Size, Value, Color);
    }
}

现在,让我们创建一个列表 class 并用您提供的(某种程度上)示例数据填充它:

var sampleData = new List<Data>()
{
    new Data("Id1", "L", 35, "red"),
    new Data("Id2", "L", 65, "blue"),
    new Data("Id3", "M", 34, "blue"),
    new Data("Id4", "S", 32, "blue"),
    new Data("Id5", "S", 55, "green")
};

因为我不想写两次条件,所以我决定首先 select 一个包含数据的新匿名类型 class 和另一个 属性 我'我们已调用 ConditionsMatched 来保存此数据实际匹配的条件数。 然后我所要做的就是将 select 的结果过滤为 return 只有 ConditionsMatched 大于 0:

的那些实例
var result = sampleData
    .Select(d => new 
            {
                Data = d,
                ConditionsMatched = 
                    (d.Size == "M" ? 1 : 0) +
                    (d.Color == "blue" ? 1 : 0) +
                    (d.Value < 40 ? 1 : 0)
            })
    .Where(a => a.ConditionsMatched > 0);

结果是 IEnumerable<AnonymousType>,其中仅包含至少符合一个条件的数据。

You can see a live demo on rextester.