Ứng dụng của tôi thường cần nhóm một nhóm, sau đó trả về hàng có giá trị lớn nhất cho nhóm đó. Điều này khá dễ thực hiện trong LINQ:LINQ - Viết một phương thức mở rộng để lấy hàng có giá trị lớn nhất cho mỗi nhóm
myTable.GroupBy(r => r.FieldToGroupBy)
.Select(r => r.Max(s => s.FieldToMaximize))
.Join(
myTable,
r => r,
r => r.FieldToMaximize,
(o, i) => i)
Bây giờ giả sử tôi muốn tóm tắt điều này theo cách riêng của nó. Tôi đã cố gắng viết này:
public static IQueryable<TSource>
SelectMax<TSource, TGroupKey, TMaxKey>(
this IQueryable<TSource> source,
Expression<Func<TSource, TGroupKey>> groupKeySelector,
Expression<Func<TSource, TMaxKey>> maxKeySelector)
where TMaxKey : IComparable
{
return source
.GroupBy(groupKeySelector)
.Join(
source,
g => g.Max(maxKeySelector),
r => maxKeySelector(r),
(o, i) => i);
}
Thật không may điều này không biên dịch: maxKeySelector là một biểu thức (vì vậy bạn không thể gọi nó về r, và bạn thậm chí không thể vượt qua nó để Max Vì vậy, tôi cố gắng viết lại,. làm maxKeySelector một chức năng chứ không phải là một biểu thức:.
public static IQueryable<TSource>
SelectMax<TSource, TGroupKey, TMaxKey>(
this IQueryable<TSource> source,
Expression<Func<TSource, TGroupKey>> groupKeySelector,
Func<TSource, TMaxKey> maxKeySelector)
where TMaxKey : IComparable
{
return source
.GroupBy(groupKeySelector)
.Join(
source,
g => g.Max(maxKeySelector),
r => maxKeySelector(r),
(o, i) => i);
}
Bây giờ này biên soạn Nhưng nó không thành công trong thời gian chạy: "tình trạng quá tải không được hỗ trợ sử dụng cho các nhà khai thác truy vấn 'Max'" Đây là những gì tôi đang mắc kẹt trên: tôi cần phải tìm đúng cách để chuyển maxKeySelector vào Max().
Bất kỳ đề xuất nào? Tôi là chúng tôi ing LINQ to SQL, mà dường như tạo sự khác biệt.
Vâng, điều này chắc chắn ngắn gọn hơn, nhưng tiếc là nó không hoạt động. Tôi nhận được khá nhiều lỗi tương tự như trước: "Quá tải không được hỗ trợ được sử dụng cho toán tử truy vấn 'OrderBy'". – ctkrohn
@ctkrohn: Nhà cung cấp LINQ nào bạn đang sử dụng? Nó làm việc tốt cho tôi trên LINQ to Entities .... và trên LINQ to Objects. – StriplingWarrior
LINQ to SQL của một người này. – ctkrohn