我想根据以下小数类别构造LINQ GroupBy语句:0-50,50-100,100-250,250-above。我发现Group by variable integer range using Linq讨论了如何使用变量范围,但该查询具有有限的上限。我的查询需要能够处理250个以上的所有内容。我尝试使用decimal.maxValue作为我的上限,但是查询无法处理它,我想因为该值大于NHibernate可以处理的值。理想情况下,我想在不指定最大值的情况下执行此操作,因此查询独立于数据库。
编辑:我很确定我可以通过使用一组楼层值并遵循链接中的模式来完成此操作。但我很好奇是否有一种全能的分组构造。
答案 0 :(得分:2)
修改强>
您已将OP更改为可以使用楼层功能的状态,但您想了解默认分组。
在数学上,地板功能是等效的。在天花板的情况下,他们使用的数据的下限大概为0.在floor的情况下,逻辑上限是正无穷大(实际上它最终是DB支持的最高值,因为整数不支持无限的概念)。它可以让你到达目的地。
如果你想要一些可能更适用于其他情况的东西,你可以尝试这样的事情:
items.GroupBy(item =>
(
floors.FirstOrDefault(floor => floor <= item)
?? "Default"
)
.ToString()
);
它可能不适用于Linq到NHibernate,因为我认为这不会很好地映射到SQL。相反,您可以先将整个集合导入内存(.ToList()
),然后将您的分组添加为Linq to Objects查询。
在这种情况下使用它没有多大意义,但在非数字分组的情况下可能会这样:
var groups = new HashSet<string>
{
"Orange",
"Green",
"Mauve",
};
items.GroupBy(item =>
groups.Contains(item.Color)
? item.Color
: "Default"
);
编辑前:
您可以简单地撤消逻辑,并自动将 下的所有内容包含在某个值中。
var floors = new[] { 250, 100, 50, 0 };
var groupings = items.GroupBy(item => floors.First(floor => floor <= item));
工作原理:
选择270
项
列表中的第一项是它所属的第一个项目。这是因为250 <= 270
。
选择99
项
列表中的第三个项目是它所属的第一个项目。 250
不低于99
。 100
不低于99
。但50
小于99
。
项目50
将落入第三个桶中
它小于250
和100
,但等于50
。
与您问题中的描述不完全匹配:
你的小组描述有点破碎。你必须分别对它们进行bucketize以使这个算法工作。会有0-50
个存储桶,51-100
存储桶等。或0-49
存储桶,50-99
存储桶等。
0-50
存储桶和50-100
存储桶不能同时存在。