Không có cách nào đơn giản nếu muốn giữ một danh sách phẳng của cột (ví dụ:Chỉnh sửa2 của OP) và cũng muốn có một giải pháp chung hoạt động với bất kỳ IEnumerable nào mà không yêu cầu bạn liệt kê ra các cột dự kiến. Tuy nhiên, có một cách vòng xoay để loại bỏ nó là đưa kết quả truy vấn vào một DataTable sử dụng phương thức ToDataTable() từ here và sau đó thêm cột RowNumber vào bảng đó.
var table = query.ToList().ToDataTable();
table.Columns.Add("RowNum", typeof(int));
int i = 0;
foreach (DataRow row in table.Rows)
row["RowNum"] = ++i;
Điều này có thể gây ra vấn đề về hiệu năng với bộ dữ liệu lớn nhưng cũng không quá chậm. Trên máy của tôi, một tập dữ liệu với ~ 6500 hàng mất 33ms để xử lý.
Nếu truy vấn ban đầu của bạn trả về một loại ẩn danh, thì định nghĩa kiểu đó sẽ bị mất trong chuyển đổi, do đó bạn sẽ mất đánh máy tĩnh trên tên cột của kết quả IEnumerable khi bạn gọi table.AsEnumerable(). Nói cách khác, thay vì có thể viết một cái gì đó như table.AsEnumerable(). Đầu tiên() RowNum bạn thay vì phải viết table.AsEnumerable(). First() ["RowNum"]
Tuy nhiên, nếu bạn không quan tâm đến hiệu suất và thực sự muốn gõ lại tĩnh, sau đó bạn có thể sử dụng JSON.NET để chuyển đổi DataTable thành chuỗi json và sau đó quay lại danh sách dựa trên loại ẩn danh từ kết quả truy vấn ban đầu. Phương thức này yêu cầu một trường giữ chỗ RowNum có mặt trong kết quả truy vấn ban đầu.
var query = (from currRow in someTable
where currRow.someCategory == someCategoryValue
orderby currRow.createdDate descending
select new { currRow.someCategory, currRow.createdDate, RowNum = -1 }).ToList();
var table = query.ToDataTable();
//Placeholder RowNum column has to already exist in query results
//So not adding a new column, but merely populating it
int i = 0;
foreach (DataRow row in table.Rows)
row["RowNum"] = ++i;
string json = JsonConvert.SerializeObject(table);
var staticallyTypedList = JsonConvert.DeserializeAnonymousType(json, query);
Console.WriteLine(staticallyTypedList.First().RowNum);
Điều này đã thêm khoảng 120ms vào thời gian xử lý cho tập dữ liệu mục 6500 của tôi.
Thật điên rồ, nhưng nó hoạt động.
bản sao có thể có của [Làm thế nào để bạn thêm trường chỉ mục vào kết quả LINQ] (http://stackoverflow.com/questions/269058/how-do-you-add-an-index-field-to-linq-results) – sloth
Bạn có muốn chỉ mục của hàng trong bảng hoặc chỉ mục của kết quả được lọc không? –
có thể trùng lặp của [thêm chỉ mục vào kết quả truy vấn LINQ] (http://stackoverflow.com/questions/4999365/adding-index-to-linq-query-result) – sloth