是否可以在Linq中按方法分组使用方法?
我正在尝试按自定义方法分组。例如,如果组id是某物,那么我想从是否可以在Linq中按方法分组使用方法?,linq,asp.net-core-3.1,Linq,Asp.net Core 3.1,我正在尝试按自定义方法分组。例如,如果组id是某物,那么我想从GetClientGroup的方法返回1或0,然后我想按值分组。但我得到了这样的错误 错误 无法翻译。以可以翻译的形式重写查询,或者通过插入对AsEnumerable()、AsAsAsAsyncEnumerable()、ToList()或ToListSync()的调用显式切换到客户端计算。有关更多信息,请参阅 我认为这个错误是在运行时出现的,而不是在编译时。我说得对吗 IEnumerable和iquierable 您应该知道IEnum
GetClientGroup
的方法返回1或0,然后我想按值分组。但我得到了这样的错误
错误
无法翻译。以可以翻译的形式重写查询,或者通过插入对AsEnumerable()、AsAsAsAsyncEnumerable()、ToList()或ToListSync()的调用显式切换到客户端计算。有关更多信息,请参阅
我认为这个错误是在运行时出现的,而不是在编译时。我说得对吗 IEnumerable和iquierable 您应该知道
IEnumerable
和IQueryable
之间的区别
实现IEnumerable
或IQueryable
的对象表示潜在的,以提供可枚举序列。一旦你有了序列,你可以要求第一个元素,一旦你有了这个,你可以要求下一个元素,只要有一个元素
这种对元素的迭代通常使用foreach(序列中的var元素){…}
完成。这可转化为以下内容:
IEnumerable<MyType> sequence = ... // the potential to get iterator
IEnumerator<MyType> enumerator = sequence.GetEnumerator(); // get the iterator
while (enumerator.MoveNext()) // iterate
{ // as long as there are items
MyType item = enumerator.Current; // fetch the item
ProcessItem(item); // and process it.
}
唉,你忘了写GetClientGroup做什么了。它似乎接受订单的ClienteleId和GroupId,并返回一个类似于ClientGroup的整数
最简单的方法是用该方法中的代码替换对GetClientGroup的调用不要调用任何其他方法
DateTime deliveryLimitDate = new DateTime(2020, 06, 29).Date;
var result = dbContext.Orders
.Where (order => order.ClienteleId == clienteleId
&& order.DeliveryDate != null
&& order.DeliveryDate >= deliveryLimitDate)
.GroupBy(order => new // Parameter KeySelector
{
ClienteleId = order.ClienteleId,
DeliveryDate = order.DeliveryDate,
ClientGroup= order.OrderTypeId == 22 ? 259 :
// formula in GetClientGroup(...)
// for example
(int)order.GroupId << 16 + order.ClienteleId
// parameter ResultSelector
group => new { ClienteleId = group.Key.ClienteleId});
唉,因为我不知道你的GetClientGroup,所以我不能给你参数KeySelector错误消息很清楚,
GetClientGroup
自定义方法无法转换为SQL。那是什么方法?顺便说一句,正如错误所说,您可以检索数据,然后将其分组到内存中。
Expression<Func<TSource,TKey>> keySelector
DateTime deliveryLimitDate = new DateTime(2020, 06, 29).Date;
var result = dbContext.Orders
.Where (order => order.ClienteleId == clienteleId
&& order.DeliveryDate != null
&& order.DeliveryDate >= deliveryLimitDate)
.GroupBy(order => new // Parameter KeySelector
{
ClienteleId = order.ClienteleId,
DeliveryDate = order.DeliveryDate,
ClientGroup= order.OrderTypeId == 22 ? 259 :
// formula in GetClientGroup(...)
// for example
(int)order.GroupId << 16 + order.ClienteleId
// parameter ResultSelector
group => new { ClienteleId = group.Key.ClienteleId});
// parameter ResultSelector
group => group.Key.ClienteleId});