2010-06-21 31 views
5

Tôi có một bảng cơ sở dữ liệu chứa các mục nhập cho thời gian bắt đầu và thời gian kết thúc của một sự kiện. Tôi muốn lấy những mục đó và tìm độ dài trung bình của một sự kiện. Phép trừ là không có vấn đề gì. Tuy nhiên, khi tôi cố gắng để có được giá trị trung bình, trình biên dịch phàn nàn.LINQ Thời gian trung bìnhSpan?

Đây là hiện truy vấn LINQ của tôi:

public TimeSpan? getAverageTime() 
    { 
     return (from EventTime in db.EventTimes 
       where EventTime.EventTimesID > 0 
       select (EventTime.TimeEnd - EventTime.TimeStart)).Average(); 
    } 

Tôi cũng đã cố gắng .Sum() và .Aggregate() để tôi có thể có một cái gì đó để làm việc với, nhưng không ai được chấp nhận.

Phương pháp tốt nhất để hoàn thành mục tiêu của tôi là gì?

+1

Làm thế nào chính xác không trình biên dịch phàn nàn? –

+0

Lỗi trình biên dịch bạn nhận được là gì? –

+0

System.LINQ.IQueryable Không chứa định nghĩa cho 'Trung bình' –

Trả lời

6

Có vẻ như bạn phải sử dụng một SqlMethods.DateDiff trong bản Tuyên Bố linq2sql (chức năng DATEDIFF nếu SQL):

public int getAverageTime() 
    { 
     return (from EventTime in db.EventTimes 
       where EventTime.EventTimesID > 0 
       select (SqlMethods.DateDiffMinute(EventTime.TimeStart, EventTime.TimeEnd)).Average(); 
    } 
+2

Bạn chính xác! Điều này làm việc tuyệt vời Sự thay đổi duy nhất cần thiết là TimeEnd đến trước. –

5

Average không hoạt động với giá trị TimeSpan, là những gì bạn nhận được khi bạn trừ hai giá trị DateTime. Hãy thử trung bình (EventTime.TimeEnd - EventTime.TimeStart).TotalMilliseconds sau đó chuyển đổi trở lại thành một TimeSpan sau đó.

+0

Tuyệt vời. Cái này làm việc cho tôi. Đã có một danh sách các đối tượng TimeSpan để avergae ra, và đề xuất của bạn đã làm việc: TimeSpan avg = new TimeSpan (TimeSpan.TicksPerMillisecond * (long) System.Math.Round (ProcessElementTimes.Select (time => time.TotalMilliseconds) .Average(), 0)); –

+0

@David: Bạn có thể đơn giản hóa nó thành 'TimeSpan.FromTicks (ProcessElementTimes.Average (x => x.Ticks);' Bên cạnh đó, bạn có thực sự cần làm tròn không? Nếu bạn làm thế, làm tròn kết quả thay vì mỗi giá trị sẽ nhiều hơn – BatteryBackupUnit

-2
var avg=(from t in array select (t.endtime.Ticks-t-starttime.Ticks)).Average(); 
Console.Write(new DateTime((long)avg).TimeOfDay); 
Các vấn đề liên quan