2012-06-13 46 views
13

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ệ.

+10

Mã xấu không nhất thiết phải là mã không hiệu quả. –

+0

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

+0

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. –

Trả lời

0

Bạn có thể sử dụng UTC DateTime và định thời gian sau nó.

+0

Bạn có nghĩa là hàm DateTime ToUniversalTime()? Điều này không hoạt động trong LINQ đối với các thực thể. Bạn chỉ có thể sử dụng một vài hàm và thuộc tính trong LINQ cho các thực thể. – Zeezer

+0

LINqToEntity cố gắng chuyển đổi yêu cầu của bạn thành truy vấn sql. Nó không thể dịch ToUniversalTime() thành Sql. Tôi khuyên bạn nên lấy tất cả dữ liệu đầu tiên (ví dụ .ToList()) và tạo bất kỳ thứ gì với bộ sưu tập dữ liệu. Trong trường hợp bạn có thể sử dụng hàm ToUTCTime() trong truy vấn LINQ. –

+0

Tôi đang xử lý các bảng lớn và thống kê phức tạp. Để có được tất cả dữ liệu đầu tiên sẽ có tác động đến hiệu suất mà im không sẵn sàng thực hiện. – Zeezer