2009-08-11 18 views
10

Tôi mới dùng LINQ và LINQ to SQL và không hiểu điều gì sai với mã này. Excetpion.Message Tôi nhận được là.NET: LINQ's Last()

"Toán tử truy vấn 'Cuối cùng' không được hỗ trợ."

Điều tôi đang cố gắng làm là sớm nhất là LastActivityUtc trong số 100 mới nhất. Mã sau.

var postTimes = from post in db.Post 
       where post.LastActivityUtc != null 
       orderby post.LastActivityUtc descending 
       select post.LastActivityUtc; 

DateTime startDate = DateTime.MinValue; 

if (postTimes.Count() >= 2) 
{ 
    startDate = postTimes.Take(100).Last().Value; 
} 

Trả lời

20

Brandon đã đăng một giải pháp, nhưng nó đòi hỏi phải sao chép toàn bộ danh sách trong bộ nhớ.

Nếu bạn chỉ muốn "chuyển tiếp" từ các truy vấn cơ sở dữ liệu trong quá trình, bạn có thể sử dụng AsEnumerable:

startDate = postTimes.Take(100).AsEnumerable().Last().Value; 

Có nói rằng, bạn có thể làm muốn gọi ToList(), nhưng trước đó - để tránh phải thực hiện truy vấn một lần cho số lượng, và một lần cho giá trị cuối cùng:

var postTimes = (from post in db.Post 
       where post.LastActivityUtc != null 
       orderby post.LastActivityUtc descending 
       select post.LastActivityUtc).Take(100).ToList(); 

DateTime startDate = DateTime.MinValue; 

if (postTimes.Count >= 2) 
{ 
    startDate = postTimes.Last().Value; 
} 

Điều đó sẽ thực hiện truy vấn cơ sở dữ liệu lần, nhưng chỉ lấy 100 bản ghi đầu tiên vào bộ nhớ. Tất nhiên, nó rơi xuống phần nào nếu bạn định sử dụng postTimes ở nơi khác ...

+1

Chuột, rõ ràng, câu trả lời ban đầu của tôi không hề ngu ngốc! Tôi đổ lỗi cho Marc;) –

+0

@Mehrdad - Tôi khiêm tốn chấp nhận trách nhiệm! – Marc

+2

Ai ngu ngốc hơn? Người ngu, hay kẻ ngu theo anh ta? –

4

Gọi ToList() trên postTimes và sau đó hãy thử sử dụng .Last()

startDate = postTimes.Take(100).ToList().Last().Value; 
+1

Điều này sẽ hiệu quả nhưng không vì lý do bạn đề cập. '.AsEnumerable()' thay vì '.ToList()' cũng sẽ hoạt động. Lý do hai công trình này là họ không cố dịch biểu thức sang SQL. Họ chỉ lấy 100 hàng và xử lý nó trên máy khách. –

+0

Lỗi của tôi, tôi sẽ xóa phần câu trả lời đó. – Brandon

Các vấn đề liên quan