是否可以计算 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=M
或 color=blue
或 size<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>
,其中仅包含至少符合一个条件的数据。
我想知道是否有一种方法可以计算一行满足的条件数,以便根据满足大部分条件的条件对 return 值进行排序。
假设 table 是这样的:
假设条件是 size=M
或 color=blue
或 size<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>
,其中仅包含至少符合一个条件的数据。