Tôi muốn hiển thị lịch sử kế toán của khách hàng trong một số DataGridView
và tôi muốn có một cột hiển thị tổng số đang chạy cho số dư của chúng. Cách cũ tôi đã làm điều này là bằng cách nhận dữ liệu, lặp qua dữ liệu và thêm hàng vào số DataGridView
từng cái một và tính tổng số đang chạy tại thời điểm đó. Què. Tôi sẽ sử dụng LINQ to SQL, hoặc LINQ nếu không thể với LINQ to SQL, để tìm ra các tổng số đang chạy để tôi có thể chỉ đặt DataGridView.DataSource
cho dữ liệu của mình.LINQ to SQL và tổng số đang chạy trên các kết quả đã đặt hàng
Đây là một ví dụ siêu đơn giản về những gì tôi đang chụp. Nói rằng tôi có lớp sau.
class Item
{
public DateTime Date { get; set; }
public decimal Amount { get; set; }
public decimal RunningTotal { get; set; }
}
Tôi muốn một L2S, hoặc LINQ, tuyên bố rằng có thể tạo ra kết quả mà trông như thế này:
Date Amount RunningTotal
12-01-2009 5 5
12-02-2009 -5 0
12-02-2009 10 10
12-03-2009 5 15
12-04-2009 -15 0
Chú ý rằng có thể có nhiều mục có cùng ngày (12-02-2009). Các kết quả sẽ được sắp xếp theo ngày trước khi tổng số hoạt động được tính toán. Tôi đoán điều này có nghĩa là tôi sẽ cần hai câu lệnh, một để lấy dữ liệu và sắp xếp nó và một giây để thực hiện tính toán tổng chạy.
Tôi đã hy vọng Aggregate
sẽ thực hiện thủ thuật, nhưng nó không hoạt động như tôi đã hy vọng. Hoặc có lẽ tôi không thể hình dung ra được.
Điều này question dường như đang diễn ra sau cùng một điều tôi muốn, nhưng tôi không thấy cách câu trả lời được chấp nhận/chỉ giải quyết được vấn đề của mình.
Bất kỳ ý tưởng nào về cách gỡ cài đặt này?
Sửa Chải câu trả lời từ Alex và DOK, đây là những gì tôi đã kết thúc với:
decimal runningTotal = 0;
var results = FetchDataFromDatabase()
.OrderBy(item => item.Date)
.Select(item => new Item
{
Amount = item.Amount,
Date = item.Date,
RunningTotal = runningTotal += item.Amount
});
Cảm ơn công cụ mới! : RunningTotal = runningTotal + = item.Amount –
Sẽ không thực thi giải pháp này trên máy khách? (tức là nó phải kéo toàn bộ kết quả để có được câu trả lời đúng?) - có vẻ như một cái gì đó như thế này sẽ có hiệu suất cao hơn nếu nó được thực hiện trên máy chủ SQL ... – BrainSlugs83
Sử dụng biến bên ngoài truy vấn rất nguy hiểm! Bởi vì 'kết quả' biến là loại' IEnumerable', thực thi ** của nó sẽ bị trì hoãn ** cho đến sau này. Nếu bạn thay đổi giá trị 'runningTotal' trước đó, truy vấn kết quả của bạn sẽ không chính xác nữa. Để an toàn, bạn cần phải liệt kê nó ngay lập tức (để liệt kê hoặc mảng). Tôi không thấy bất cứ điều gì sai ở đây với việc sử dụng một vòng lặp 'foreach' đơn giản. – Alexey