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

时间:2018-10-26 06:48:35

标签: c# sql linq-to-entities

我想知道是否有一种方法可以计算一行满足的条件数,以便按符合大多数条件的返回值对返回值进行排序。

让我们说这张桌子是这样的:

this

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

我期望的结果是这样的:

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

1 个答案:

答案 0 :(得分:2)

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

请注意,由于您写了size=M or color=blue or size<40,所以我不得不稍微调整一下您的条件-但是size既可以是字符串,也可以是数字,不能完全相同-所以我认为这是一个错字应该是size=M or color=blue or value<40

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

因此,让我们从一个简单的数据类开始:

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

现在,让我们创建该类的列表,并使用您提供的样本数据填充它:

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

由于我不想两次编写条件,因此我决定首先选择一个新的匿名类型,该类型包含Data类和另一个我称为ConditionsMatched的属性,以保存此条件的数量。数据实际匹配。 然后,我要做的就是过滤此select的结果,以仅返回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.