Tôi có cùng một vấn đề được đăng ở đây: LINQ to Entities group-by failure using .dateNET LINQ to nhóm tổ chức theo ngày (ngày)
Tuy nhiên, câu trả lời là không chính xác 100%. Nó hoạt động trong mọi trường hợp ngoại trừ khi các múi giờ khác nhau được sử dụng. Khi các múi giờ khác nhau được sử dụng, nó cũng nhóm trên múi giờ. Tại sao? Tôi đã bỏ qua điều này bằng cách sử dụng nhiều hàm thực thể.
int localOffset= Convert.ToInt32(
TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).TotalMinutes);
var results = (
from perfEntry in db.entry
where (....)
select new {
perfEntry.Operation, perfEntry.Duration,
localTime = EntityFunctions.AddMinutes(perfEntry.Start,
localOffset - EntityFunctions.GetTotalOffsetMinutes(
perfEntry.Start))
}
).GroupBy(x => new {
Time = EntityFunctions.TruncateTime(
EntityFunctions.CreateDateTime(x.localTime.Value.Year,
x.localTime.Value.Month, x.localTime.Value.Day, 0, 0, 0)),
x.Operation }
).OrderByDescending(a => a.Key).
Select(g => new {
Time = g.Key.Time,
...
});
Có ai đó biết cách làm điều này một cách thích hợp không? Mã này quá xấu và có lẽ rất kém hiệu quả.
CẬP NHẬT (cảnh báo):
Tôi cũng nhận ra rằng hàm EntityFunctions.CreateDateTime bị lỗi. Nó không tương thích với những năm nhuận, như năm nay. 29 feb 2012 sẽ ném một ngoại lệ.
Mã xấu không nhất thiết phải là mã không hiệu quả. –
vâng, nhưng thao tác đơn giản như vậy sẽ có thể viết theo cách dễ dàng hơn? – Zeezer
Không nhất thiết. Hãy nhớ rằng, LINQ to Entities phải chuyển đổi C# thành SQL, điều đó có nghĩa là nó có nhiều hạn chế về những gì bạn có thể làm với nó bởi vì không có SQL hỗ trợ hoạt động. EntityFunctions là có đặc biệt để đối phó với những hạn chế này, vì vậy bạn phải sử dụng chúng nếu bạn muốn những gì họ làm. –