子查询的 GroupBy 方法语法
GroupBy method syntax for subquery
我有一个查询语法查询,我需要将其转换为方法语法,因为我需要在子查询的末尾添加 .Take() 运算符。这是我的:
var TheQuery = (from col in MyDC.SomeTable
ordery ....
where.....
group s by s.SomeColumnID into TheGroups
from subgroup in TheGroups
....)
我无法将其转换为方法语法;这就是我想写的:
var TheQuery = MyDC.SomeTable
.OrderByDescending(....
.Where(.....
.GroupBy(s => s.SomeColumnID into TheGroups) //here
.TheGroups //here
.Where(....
我相信这很容易,但我想不通。如何将查询转换为方法语法以便分组可用于子查询?
在 Shyju 尝试后编辑
这是我现在拥有的:
var TheQuery = MyDC.SomeTable
.OrderByDescending(s => s.ExpirationDate)
.Where(s => s.ExpirationDate < DateTime.UtcNow)
.Where(s => s.UserID == SomeParameter)
.GroupBy(s => s.BasketID, v => v, (k, v) => new SomeModel()
{
BasketID = v.BasketID,
ExpirationDate = v.ExpirationDate,
SomeProp = v.SomeProp
....
}).Take(1).ToList();
我按 BasketID 对所有元素进行分组,这些元素的 ExpirationDate 小于 UtcNow,我只想要每个篮子的最新元素以及 SomeProp 属性(一个字节)为等于 2、3 或 4。
如果您要对数据进行分组,这应该可行。
var grouped2 = MyDC.SomeTable
.GroupBy(s => s.Name, v => v, (k, v) => new {k, v});
结果分组的时候肯定可以调用Take
方法
var groupedWithFiveItemsPerGroup = MyDC.SomeTable.GroupBy(s => s.Name, v => v,
(k, v) => new { Name = k, FiveItems= v.Take(5) });
如果您想在分组数据上添加 where 子句,您也可以这样做。
var groupedWithFiveItemsPerGroup = MyDC.SomeTable.GroupBy(s => s.Name, v => v,
(k, v) => new { Name = k, FiveItems= v.Where(r=>r.SomeProperty=="Hi").Take(5) });
将 s.Name
替换为您的 属性 姓名。
您可以过滤每个组中的元素,这样做:
var TheQuery = MyDC.SomeTable
.OrderByDescending(....
.Where(.....
.GroupBy(s => s.SomeColumnID)
.Select(items => new { Key = items.Key,
Values = items.Where(i => i.SomeOtherColumnId == someId).Take(10) });
如果您只想获取单个数组中每个组的过滤元素,请使用 SelectMany()
:
var TheQuery = MyDC.SomeTable
.OrderByDescending(....
.Where(.....
.GroupBy(s => s.SomeColumnID)
.SelectMany(items => items.Where(i => i.SomeOtherColumnId == someId).Take(10));
编辑:
如果只需要每个组中满足条件的first/top个元素:
var TheQuery = MyDC.SomeTable
.Where(s => s.ExpirationDate < DateTime.UtcNow)
.Where(s => s.UserID == SomeParameter)
.Select(v => new SomeModel
{
BasketID = v.BasketID,
ExpirationDate = v.ExpirationDate,
SomeProp = v.SomeProp
//....
})
.GroupBy(s => s.BasketID)
.Select(items => items.Where(item => item.SomeProp == 2 ||
item.SomeProp == 3 ||
item.SomeProp == 4).OrderByDescending(item => item.ExpirationDate).First()).ToList();
我有一个查询语法查询,我需要将其转换为方法语法,因为我需要在子查询的末尾添加 .Take() 运算符。这是我的:
var TheQuery = (from col in MyDC.SomeTable
ordery ....
where.....
group s by s.SomeColumnID into TheGroups
from subgroup in TheGroups
....)
我无法将其转换为方法语法;这就是我想写的:
var TheQuery = MyDC.SomeTable
.OrderByDescending(....
.Where(.....
.GroupBy(s => s.SomeColumnID into TheGroups) //here
.TheGroups //here
.Where(....
我相信这很容易,但我想不通。如何将查询转换为方法语法以便分组可用于子查询?
在 Shyju 尝试后编辑
这是我现在拥有的:
var TheQuery = MyDC.SomeTable
.OrderByDescending(s => s.ExpirationDate)
.Where(s => s.ExpirationDate < DateTime.UtcNow)
.Where(s => s.UserID == SomeParameter)
.GroupBy(s => s.BasketID, v => v, (k, v) => new SomeModel()
{
BasketID = v.BasketID,
ExpirationDate = v.ExpirationDate,
SomeProp = v.SomeProp
....
}).Take(1).ToList();
我按 BasketID 对所有元素进行分组,这些元素的 ExpirationDate 小于 UtcNow,我只想要每个篮子的最新元素以及 SomeProp 属性(一个字节)为等于 2、3 或 4。
如果您要对数据进行分组,这应该可行。
var grouped2 = MyDC.SomeTable
.GroupBy(s => s.Name, v => v, (k, v) => new {k, v});
结果分组的时候肯定可以调用Take
方法
var groupedWithFiveItemsPerGroup = MyDC.SomeTable.GroupBy(s => s.Name, v => v,
(k, v) => new { Name = k, FiveItems= v.Take(5) });
如果您想在分组数据上添加 where 子句,您也可以这样做。
var groupedWithFiveItemsPerGroup = MyDC.SomeTable.GroupBy(s => s.Name, v => v,
(k, v) => new { Name = k, FiveItems= v.Where(r=>r.SomeProperty=="Hi").Take(5) });
将 s.Name
替换为您的 属性 姓名。
您可以过滤每个组中的元素,这样做:
var TheQuery = MyDC.SomeTable
.OrderByDescending(....
.Where(.....
.GroupBy(s => s.SomeColumnID)
.Select(items => new { Key = items.Key,
Values = items.Where(i => i.SomeOtherColumnId == someId).Take(10) });
如果您只想获取单个数组中每个组的过滤元素,请使用 SelectMany()
:
var TheQuery = MyDC.SomeTable
.OrderByDescending(....
.Where(.....
.GroupBy(s => s.SomeColumnID)
.SelectMany(items => items.Where(i => i.SomeOtherColumnId == someId).Take(10));
编辑:
如果只需要每个组中满足条件的first/top个元素:
var TheQuery = MyDC.SomeTable
.Where(s => s.ExpirationDate < DateTime.UtcNow)
.Where(s => s.UserID == SomeParameter)
.Select(v => new SomeModel
{
BasketID = v.BasketID,
ExpirationDate = v.ExpirationDate,
SomeProp = v.SomeProp
//....
})
.GroupBy(s => s.BasketID)
.Select(items => items.Where(item => item.SomeProp == 2 ||
item.SomeProp == 3 ||
item.SomeProp == 4).OrderByDescending(item => item.ExpirationDate).First()).ToList();